首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >处理Python套接字

处理Python套接字
EN

Stack Overflow用户
提问于 2018-06-11 01:55:15
回答 1查看 75关注 0票数 0

首先,我有以下代码...很管用。很明显。

代码语言:javascript
复制
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中实现套接字的相互矛盾的资料。

首先,您已经获得了herehere形式的信息,这些信息会让您认为空的缓冲区是断开连接的套接字。这肯定是我第一次读到的内容(上面的代码在这一点上已经有几个月的历史了,也是我第一次认真尝试用Python实现套接字)。

然而,也有一些this帖子似乎更有见地。也就是说,如果缓冲区为空,则意味着您已经读取了目前可用的所有内容。有点像我一开始就理解TCP是如何工作的。也许我错过了,但是文档中有没有提到mentioned呢?

不管怎样..。关于我的代码,我意识到,每次缓冲区为空时,我都会丢弃客户端套接字并重新连接以读取新信息。这显然不是理想的,我想要改变它。

在C中,如果recv返回0,则缓冲区为空。如果它返回<0,则说明出了问题,您可以销毁文件描述符并尝试重新建立连接。在Python中如何做同样的事情呢?

编辑:只是一个更多的上下文-我已经将接收到的消息的前五个字节编码为整个消息的大小,所以我将能够在内部测试“完成”,前提是我可以区分空的缓冲区和丢弃的套接字。

Python 2:我特别问的是如何检查套接字中的空缓冲区以及断开的连接。当然,两者的处理方式应该不同,而且我需要确保通过可能执行多个recv()调用来获得完整的消息。

EN

回答 1

Stack Overflow用户

发布于 2018-06-11 05:57:58

默认情况下,socket.recv是一个阻塞调用,它将挂起线程,直到它在缓冲区中接收到某些东西,然后它将返回整个缓冲区。

当套接字断开连接时,缓冲区将变为b'‘非空,因此它返回b'’。

调用.recv时没有数据的非阻塞套接字将返回套接字异常。

因此,为了回答我认为的问题,默认情况下,当客户端断开连接时,socket.recv将返回b'‘。

编辑:要查看套接字是否为空,可以禁用阻塞,然后在缓冲区为空时通过调用recv捕获将引发的异常。

或者使用带有套接字的select模块将套接字排序为3个列表,即可读、可写和有异常的套接字。

https://docs.python.org/3/library/select.html#select.select

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50786530

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档