我目前正在尝试通过网络基础教程,我注意到一个基本的客户端/服务器程序会冻结服务器,当收到所有数据时,尝试从客户端读取更多数据。基本上代码看起来像这样:
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。任何帮助,将不胜感激, 感谢
答案 0 :(得分:3)
正如其他人所指出的那样,原因是套接字默认是阻塞的。这意味着recv
函数将阻止程序的执行,直到某些数据到达。除非事情发生变化,否则程序将永远等待,或者直到服务器断开连接。
一种解决方案是使用settimeout
函数切换到非阻塞套接字,如sock.settimeout(2)
。这意味着如果在2秒内没有收到任何内容,则会抛出异常。您可以捕获该异常并相应地处理它。