首页 文章

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

提问于
浏览
2

我正在使用客户端/服务器套接字处理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

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

检测不正常的客户端断开是否是一个很好的解决方案?

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

1 回答

  • 1

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

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

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

相关问题