我目前正试图通过一个基本的网络教程,我注意到一个基本的客户机/服务器程序将冻结服务器试图从客户机读取更多的数据时,所有的数据都收到。基本上代码如下:
def recv_all(sock,length):
data=''
while len(data)<length:
more=sock.recv(length-len(data))
if not more :
raise EOFError('socket inchis %d octeti intr-un mesaj de %d octeti'%(len(data),length))
data+=more
return data
此函数从客户端和服务器调用,但服务器将首先使用它来处理客户端请求。一切正常,直到第二次调用sock.recv时,请求消息已收到。
调试器没有跳转到下一行(更多的是0),而是冻结在那里,我不知道这可能是什么原因。
我的操作系统是Windows XP,如果这有任何关系的话。任何帮助都将不胜感激, 谢谢
正如其他人指出的,原因是套接字在默认情况下被阻塞。这意味着
recv
函数将阻塞程序的执行,直到某些数据到达为止。除非情况发生变化,否则程序将永远等待,或者直到服务器断开连接。一种解决方案是使用
settimeout
函数切换到非阻塞套接字,就像这样sock.settimeout(2)
。这意味着,如果在2秒内未收到任何消息,则将引发异常。您可以捕获该异常并相应地处理它。相关问题 更多 >
编程相关推荐