首先,我有以下代码...很管用。很明显。
while not self.socket_connected:
try:
client_socket.connect((self.hostname, self.port))
self.socket_connected = True
except:
sleep(0.5)
pass
while self.socket_connected:
message = client_socket.recv(4096)
if(message == b''):
client_socket.close()
self.socket_connected = False
break
#...do stuff
我之所以说“显然”,是因为我正在阅读关于如何在Python中实现套接字的相互矛盾的资料。
首先,您已经获得了here和here形式的信息,这些信息会让您认为空的缓冲区是断开连接的套接字。这肯定是我第一次读到的内容(上面的代码在这一点上已经有几个月的历史了,也是我第一次认真尝试用Python实现套接字)。
然而,也有一些this帖子似乎更有见地。也就是说,如果缓冲区为空,则意味着您已经读取了目前可用的所有内容。有点像我一开始就理解TCP是如何工作的。也许我错过了,但是文档中有没有提到mentioned呢?
不管怎样..。关于我的代码,我意识到,每次缓冲区为空时,我都会丢弃客户端套接字并重新连接以读取新信息。这显然不是理想的,我想要改变它。
在C中,如果recv
返回0,则缓冲区为空。如果它返回<0,则说明出了问题,您可以销毁文件描述符并尝试重新建立连接。在Python中如何做同样的事情呢?
编辑:只是一个更多的上下文-我已经将接收到的消息的前五个字节编码为整个消息的大小,所以我将能够在内部测试“完成”,前提是我可以区分空的缓冲区和丢弃的套接字。
Python 2:我特别问的是如何检查套接字中的空缓冲区以及断开的连接。当然,两者的处理方式应该不同,而且我需要确保通过可能执行多个recv()
调用来获得完整的消息。
发布于 2018-06-11 05:57:58
默认情况下,socket.recv是一个阻塞调用,它将挂起线程,直到它在缓冲区中接收到某些东西,然后它将返回整个缓冲区。
当套接字断开连接时,缓冲区将变为b'‘非空,因此它返回b'’。
调用.recv时没有数据的非阻塞套接字将返回套接字异常。
因此,为了回答我认为的问题,默认情况下,当客户端断开连接时,socket.recv将返回b'‘。
编辑:要查看套接字是否为空,可以禁用阻塞,然后在缓冲区为空时通过调用recv捕获将引发的异常。
或者使用带有套接字的select模块将套接字排序为3个列表,即可读、可写和有异常的套接字。
https://stackoverflow.com/questions/50786530
复制相似问题