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模块,但同样的事情发生了。但是当客户端在localhost上然后工作完美。 主要原因是什么,如果有人能解释如何正确捕获asyncio中的网络异常。
答案 0 :(得分:2)
TLDR;通过客户端ping您的服务器。
TCP堆栈的工作方式:正常断开连接需要向对等方发送数据包。如果网络中断,则无法进行数据传输。
Localhost网络拥有关于断开连接的所有知识,但真实网络错过了有关所有移动部件的信息。
检测断开连接的唯一可靠方法是等待来自对等方的消息(可能是 ping 消息或常规数据包)并超时。
如果超时到期 - 对等体消失,通信信道的本地端也应该关闭。
这就是为什么通过TCP进行的长期通信比看起来复杂得多 - 所有生产级系统都在内部使用ping和超时。它不仅影响websockets,还影响任何具有自定义协议的信使。