这是服务器上的代码:
socket = socket.socket(socket.AF_INET,socket.soCK_STREAM)socket.bind(('localhost',RandomPort))socket.Listen(0)socket.settimeout(0.9)[Give all the clIEnts their tasks,then do the following:]while 1: data = 'None' IP = [0,0] try: ClIEnt,IP = socket.accept() data = ClIEnt.recv(1024) if data == 'Done': ClIEnt.send('Thanks') for ClIEntIP in ClIEntIPList(): if ClIEntIP == IP[0] and data == 'Done': FinishedCount += 1 if FinishedCount == 12: break except: pass
以下是所有客户端的代码:
[Receive task from server and execute. Once finished,do the following:]while 1: try: f = socket.socket(socket.AF_INET,socket.soCK_STREAM) f.connect((IPofServer,RandomPort)) f.settimeout(0.5) f.send('Done') data = f.recv(1024) if data == 'Thanks': f.shutdown(socket.SHUT_RDWR) f.close() break except: f.close() time.sleep(2+random.random()*5)
我使用过Wireshark,发现数据包正在飞来飞去.然而,“FinishedCount”似乎永远不会增加……有什么明显的错误,我在设置它时错过了吗?这是我第一次接触插座….
谢谢大家的帮助!
编辑:我对代码进行了以下更改:
在服务器上:socket.Listen现在是socket.Listen(5)
解决方法 好吧,这花了我一段时间,但我想我弄清楚是什么导致了这个:> glglgl的答案是正确的 – 使用’localhost’会使机器运行
只听自己而不是网络上的其他机器.这个
是罪魁祸首.
>将que中允许的数量从0增加到5会减少
在客户端上出现“连接被拒绝”错误的可能性
侧.
>我错误地认为套接字连接是无限的
while循环可以无限快速关闭 – 但是,有一个
无限时,两边的循环有时会导致客户端
有时会被计算两次,因为while循环不是
同步.当然,这导致了“客户不可知”
finishedCount增加两倍,这导致服务器相信所有
客户是在他们不是的时候完成的.使用chown的代码(谢谢
chown!),这可以像这样处理:
def main(): sock = socket.socket(socket.AF_INET,socket.soCK_STREAM) sock.bind((HOST,PORT)) sock.Listen(0) FINISHEDCLIENTS = [] while 1: data = 'None' IP = [0,0] try: clIEnt,ip = sock.accept() data = clIEnt.recv(1024) print "%s: Server recIEved: '%s'" % (time.ctime(),data) if data == 'Done': print "%s: Server sending: 'Thanks'" % time.ctime() clIEnt.send('Thanks') if ip[0] in CLIENT_IPS and ip[0] not in FINISHEDCLIENTS: FINISHEDCLIENTS.append(ip[0]) if len(FINISHEDCLIENTS) == 12: #raise MyException break except Exception,e: print "%s: Server Exception - %s" % (time.ctime(),e)
在客户端,我将代码更改为此(当然,
RandomPort与上面的服务器脚本中使用的相同):
SentFlag = 0data = 'no'while SentFlag == 0: try: f = socket.socket(socket.AF_INET,RandomPort)) f.settimeout(20) f.send('Done') data = f.recv(1024) if data == 'Thanks': f.shutdown(socket.SHUT_RDWR) f.close() SentFlag = 1 except: f.close() time.sleep(2*random.random())
PS:我对.shutdown()vs .close()的理解是关闭连接,但如果它正在进行另一次通信,则不一定是套接字.无论它正在做什么,.shutdown()都会关闭套接字.我虽然没有任何证据.
我认为应该这样做 – 再次感谢大家帮助修复此代码!
总结以上是内存溢出为你收集整理的无法通过Python中的套接字进行客户端 – 服务器通信全部内容,希望文章能够帮你解决无法通过Python中的套接字进行客户端 – 服务器通信所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)