recv方法上的python TCP套接字块

2024-06-01 20:48:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正试图通过一个基本的网络教程,我注意到一个基本的客户机/服务器程序将冻结服务器试图从客户机读取更多的数据时,所有的数据都收到。基本上代码如下:

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,如果这有任何关系的话。任何帮助都将不胜感激, 谢谢


Tags: 数据代码服务器客户端data客户机lenmore
1条回答
网友
1楼 · 发布于 2024-06-01 20:48:31

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

一种解决方案是使用settimeout函数切换到非阻塞套接字,就像这样sock.settimeout(2)。这意味着,如果在2秒内未收到任何消息,则将引发异常。您可以捕获该异常并相应地处理它。

相关问题 更多 >