Nos*_*sti 5 python sockets python-3.x python-asyncio
我正在处理带有客户端/服务器套接字的 Python 脚本。在寻找替代解决方案后,我不确定我的解决方案是正确的还是最好的。
我已经阅读了这些帖子:
Python 处理 socket.error: [Errno 104] 对等方重置连接
他们的解决方案对我不起作用,但我有以下内容。我不确定它是否正确或干净。
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
Run Code Online (Sandbox Code Playgroud)
如果我除了ConnectionResetError之外不使用,我会收到一个错误,因为当我杀死客户端时数据会引发connectionReset。
检测不规则的客户端断开连接是否是一个好的解决方案?
ps:感谢Prune清理措辞和语法。
只要您不与套接字交互,您就不知道它是否仍然连接。处理断开连接的正确方法不是检查套接字的状态,而是验证读取或写入操作是否由于此类错误而失败。
通常,人们总是至少等待套接字上的 read(),这是人们应该寻找断开连接的地方。当异常发生时,流将被检测为已关闭,并将异常传播到等待此套接字上的操作的任何其他任务。这意味着,如果您在一个流上有并发操作,则必须预期会在任何地方引发此异常,并在代码中的任何位置处理它。
关于捕获的异常:检查 ConnectionError 是最好的解决方案,它是与连接相关的所有异常(ConnectionAbortedError、ConnectionResetError 等)的父类。