recv方法上的python TCP套接字块

时间:2012-03-19 12:53:58

标签: python sockets

我目前正在尝试通过网络基础教程,我注意到一个基本的客户端/服务器程序会冻结服务器,当收到所有数据时,尝试从客户端读取更多数据。基本上代码看起来像这样:

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。任何帮助,将不胜感激,               感谢

1 个答案:

答案 0 :(得分:3)

正如其他人所指出的那样,原因是套接字默认是阻塞的。这意味着recv函数将阻止程序的执行,直到某些数据到达。除非事情发生变化,否则程序将永远等待,或者直到服务器断开连接。

一种解决方案是使用settimeout函数切换到非阻塞套接字,如sock.settimeout(2)。这意味着如果在2秒内没有收到任何内容,则会抛出异常。您可以捕获该异常并相应地处理它。