Python Asyncio Websocket 在 wifi 上没有检测到断开连接,但在本地主机上检测到


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,还影响任何具有自定义协议的信使。

最新更新