我可以使用 Python3.6 Sanic 在 websockets 中检测到“连接丢失”吗?

Posted

技术标签:

【中文标题】我可以使用 Python3.6 Sanic 在 websockets 中检测到“连接丢失”吗?【英文标题】:Can i detect 'connection lost' in websockets using Python3.6 Sanic? 【发布时间】:2018-01-11 10:18:01 【问题描述】:

当我的 Python3.6 Sanic Web 服务器失去与客户端应用程序的连接时(例如:用户关闭 Web 浏览器或网络故障等...),我可以检测到(如果是,如何?)

从 sanic 进口 Sanic 导入 sanic.response 作为响应 应用程序 = Sanic() @app.route('/') 异步定义索引(请求): 返回等待 response.file('index.html') @app.websocket('/wsgate') async def feed(request, ws): 而真: 数据 = 等待 ws.recv() print('收到:' + 数据) res = doSomethingWithRecvdData(数据) 等待 ws.send(res) 如果 __name__ == '__main__': app.run(主机=“0.0.0.0”,端口=8000,调试=真)

【问题讨论】:

【参考方案1】:

解决了

from sanic import Sanic
import sanic.response as response
from websockets.exceptions import ConnectionClosed

app = Sanic()


@app.route('/')
async def index(request):
    return await response.file('index.html')


@app.websocket('/wsgate')
async def feed(request, ws):
    while True:
        try:
            data = await ws.recv()
        except (ConnectionClosed):
            print("Connection is Closed")
            data = None
            break
        print('Received: ' + data)
        res = doSomethingWithRecvdData(data)
        await ws.send(res)

if __name__ == '__main__':
    app.run(host="0.0.0.0", port=8000, debug=True)

【讨论】:

谢谢,这对我有用。奇怪的是,我发现当我使用替代语法async for msg in ws:(而不是显式调用recv)时,它不会在断开连接时抛出异常。

以上是关于我可以使用 Python3.6 Sanic 在 websockets 中检测到“连接丢失”吗?的主要内容,如果未能解决你的问题,请参考以下文章

sanic性能对比

Sanic二十九:Sanic 扩展之sanic-session的使用

异步处理的框架Sanic的使用方法和小技巧

sanic-jinja2

Python3 Sanic + ssl证书

尝试在 Python 3.5 中运行 Sanic 应用程序的未定义符号