Python Asyncio Websocket没有检测到wifi上的断开连接,但是在localhost上检测到断开连接

时间:2018-04-28 09:44:57

标签: python-3.x websocket python-asyncio

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中的网络异常。

1 个答案:

答案 0 :(得分:2)

TLDR;通过客户端ping您的服务器。

TCP堆栈的工作方式:正常断开连接需要向对等方发送数据包。如果网络中断,则无法进行数据传输。

Localhost网络拥有关于断开连接的所有知识,但真实网络错过了有关所有移动部件的信息。

检测断开连接的唯一可靠方法是等待来自对等方的消息(可能是 ping 消息或常规数据包)并超时。

如果超时到期 - 对等体消失,通信信道的本地端也应该关闭。

这就是为什么通过TCP进行的长期通信比看起来复杂得多 - 所有生产级系统都在内部使用ping和超时。它不仅影响websockets,还影响任何具有自定义协议的信使。