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

5
我正在编写一个使用客户端/服务器套接字的Python脚本。在寻找替代解决方案后,我不确定我的解决方案是否正确或最佳。
我阅读了这些文章: Python处理socket.error:[Errno 104]连接被对等方重置 {{link2:Asyncio检测断开连接挂起}}
它们的解决方案对我不起作用,但我有以下解决方案。我不确定它是否正确或干净。
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错误。
检测不规则客户端断开连接是否是一个好的解决方案呢?
注:感谢Prune清理掉了措辞和语法问题。
1个回答

4
只要您不与套接字进行交互,就无法确定它是否仍然连接。处理断开连接的正确方法不是检查套接字的状态,而是验证读取或写入操作是否因此错误失败。

通常,我们总是在套接字上等待read(),这是我们应该寻找断开连接的地方。当异常发生时,流将被检测为关闭,并将异常传播到等待在此套接字上的任何其他任务。这意味着,如果您在一个流上有并发操作,则必须预计在代码的任何位置都可能引发此异常,并在代码中的任何位置处理它。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接