如何知道套接字连接是否在 python 中关闭?

新手上路,请多包涵

我仍然对了解套接字连接的状态感到困惑。这就是我正在做的。

 client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client.connect(("127.0.0.1",9979))

while True:
    msg = client.recv(4096)
    processNotificationMessage(msg)
    time.sleep(0.1)

我想连接到服务器并永远接收数据。但是我怎么知道我的客户端连接是否由于某种原因关闭了呢?

通过谷歌搜索,我发现 client.recv() 将返回一个空字符串或 client.recv() 将抛出异常(但当我停止服务器时没有异常)。但是,如果服务器本身有时发送一个空字符串怎么办?如果我尝试通过检查空字符串来重新连接,它会抛出一个异常,提示已连接。这里的解释( How to tell if a connection is dead in python )对我不起作用。

当我重新启动服务器时,客户端没有收到任何数据。

原文由 Vishal Yarabandi 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 549
1 个回答

fileno() 将为关闭的套接字返回 -1。

 cli, addr = self.sock.accept()
print(cli.fileno())
cli.close()
print(cli.fileno())

输出

376
-1

来自文档 18.1 - Socket

socket.fileno() 返回套接字的文件描述符(一个小整数),失败时返回 -1。这对 select.select() 很有用。

套接字在技术上也是一个列表,你可以找到 [closed] 标签

cli, addr = self.sock.accept()
for i in str(cli).split():
    print(i)

>  <socket.socket
> fd=488,
> family=AddressFamily.AF_INET,
> type=SocketKind.SOCK_STREAM,
> proto=0,
> laddr=('10.1.1.2',
> 80),
> raddr=('10.1.1.2',
> 16709)>
> 488
>
> -1
>
> ```

cli.close() for i in str(cli).split(): print(i)

”`

 <socket.socket
fd=504,
family=AddressFamily.AF_INET,
type=SocketKind.SOCK_STREAM,
proto=0,
laddr=('10.1.1.2',
80),
raddr=('10.1.1.2',
16833)>
504
<socket.socket
[closed]   <---
fd=-1,
family=AddressFamily.AF_INET,
type=SocketKind.SOCK_STREAM,
proto=0>
-1

原文由 omgimdrunk 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题