Python 3.5.1 - Asyncio - 检查套接字客户端是不是已断开连接

Posted

技术标签:

【中文标题】Python 3.5.1 - Asyncio - 检查套接字客户端是不是已断开连接【英文标题】:Python 3.5.1 - Asyncio - Check if socket client has disconnectedPython 3.5.1 - Asyncio - 检查套接字客户端是否已断开连接 【发布时间】:2016-04-25 15:32:43 【问题描述】:

我正在编写带有客户端/服务器套接字的 Python 脚本。搜索替代解决方案后,我不确定我的解决方案是正确的还是最好的。

我已经阅读了这些帖子:

Python handling socket.error: [Errno 104] Connection reset by peer

Asyncio detecting disconnect hangs

他们的解决方案对我不起作用,但我有以下问题。我不确定它是否正确或干净。

try:
  # See if client has disconnected.
  try:
    data = (await asyncio.wait_for(client_reader.readline(),timeout=0.01))
  except ConnectionResetError, ConnectionAbortedError) as e:
    break  # Client disconnected
except TimeoutError:
  pass  # Client hasn't disconnect

如果我不为 ConnectionResetError 使用 except,我会收到一个错误,因为当我杀死客户端时数据会引发 connectionReset

检测不规则的客户端断开是否是一个好的解决方案?

ps:感谢 Prune 清理了措辞和语法。

【问题讨论】:

【参考方案1】:

只要你不与套接字交互,你不知道它是否仍然连接。处理断开连接的正确方法不是检查套接字的状态,而是验证读取或写入操作是否因为此类错误而失败。

通常,至少总是在等待套接字上的 read(),这是人们应该寻找断开连接的地方。当异常发生时,流将被检测为已关闭,并将异常传播到等待此套接字上的操作的任何其他任务。这意味着如果您在一个流上进行并发操作,您必须期望在任何地方都会引发此异常,并在代码中的任何地方处理它。

关于捕获的异常:检查 ConnectionError 是最好的解决方案,它是与连接相关的所有异常(ConnectionAbortedError、ConnectionResetError 等)的父类。

【讨论】:

以上是关于Python 3.5.1 - Asyncio - 检查套接字客户端是不是已断开连接的主要内容,如果未能解决你的问题,请参考以下文章

Python协程之asyncio

python:asyncio模块

Python asyncio 模块

python asyncio

Python标准模块--asyncio

Python学习---Python的异步---asyncio模块(no-http)