Python 3.5.1 - Asyncio - 检查套接字客户端是否已断开连接
问题描述:
我正在使用客户端/服务器套接字处理Python脚本。在寻找替代解决方案后,我不确定我的解决方案是正确的还是最好的。Python 3.5.1 - Asyncio - 检查套接字客户端是否已断开连接
我看过这些帖子:
Python handling socket.error: [Errno 104] Connection reset by peer
Asyncio detecting disconnect hangs
他们的解决方案不为我工作,但我有以下.I'm不知道,如果它的正确或清洁。
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,我得到一个错误,因为数据引发connectionReset当我杀掉客户端。
这是一个很好的解决方案来检测不规则的客户端断开?
ps:谢谢修剪语法和语法。
答
只要你没有与套接字交互,你不知道它是否仍然连接。处理断开的正确方法不是检查套接字的状态,而是验证读取或写入操作是否因此类错误而失败。
通常,人们总是至少在socket上等待一个read(),这是应该查找断开连接的地方。当异常发生时,流将被检测为关闭并将异常传播给等待此套接字上的操作的任何其他任务。这意味着如果你在一个流上有并发操作,你必须期望这个异常在任何地方引发,并在代码中的任何地方处理它。
关于捕获到的异常:检查ConnectionError是最好的解决方案,它是与连接相关的所有异常(ConnectionAbortedError,ConnectionResetError等)的父类。