async def relayHandler(request):
print('Websocket connection starting')
ws = aiohttp.web.WebSocketResponse(autoclose=True)
await ws.prepare(request)
print('Websocket connection ready')
async for msg in ws:
print(msg)
if msg.type == aiohttp.WSMsgType.TEXT:
print(msg.data)
if msg.data == 'close':
await ws.close()
else:
await ws.send_str(msg.data + '/answer')
elif msg.type == aiohttp.WSMsgType.ERROR:
print('ws connection closed with exception %s' %ws.exception())
print('Websocket connection closed')
return ws
这是我的WebSocket处理程序,它在Asyncio之上使用AIOHTTP。问题是如果我断开客户端 wifi 连接,它不会检测到连接丢失。我也尝试使用 Websockets 模块,但同样的事情发生了。但是当客户端在本地主机上时,就可以完美地工作。 造成这种情况的主要原因是什么,如果有人可以解释如何在 asyncio 中正确捕获网络异常。
TLDR;通过客户端 ping 您的服务器。
这就是 TCP 堆栈的工作方式:正常断开连接需要向对等方发送数据包。如果网络中断,则无法进行数据传输。
本地主机网络拥有有关断开连接的所有知识,但实际网络会丢失有关所有移动部件的信息。
检测断开连接的唯一可靠方法是等待来自对等方的消息(可以是ping消息或常规数据包(超时。
如果超时已过期 - 对等方消失,则通信通道的本地结束也应关闭。
这就是为什么任何通过TCP进行的长期通信都比看起来要复杂一些 - 所有生产级系统在内部使用ping和超时。它不仅影响websockets,还影响任何具有自定义协议的信使。