【问题标题】:How to gracefully handle auto disconnect of Daphne websockets如何优雅地处理 Daphne websockets 的自动断开连接
【发布时间】:2020-11-25 09:41:22
【问题描述】:

达芙妮有一个参数--websocket_timeoutlink。如文档中所述,

--websocket_timeout WEBSOCKET_TIMEOUT
                 
Maximum time to allow a websocket to be connected. -1 for infinite.

套接字已断开连接,无法进行进一步的通信。但是,客户端没有收到断开连接事件,因此无法优雅地处理它。我的客户如何知道套接字是否断开连接?我不想(在客户端)保留一个计时器,也不想继续重新检查它。

这就是我部署应用程序的方式

daphne -b 0.0.0.0 -p 8000 --websocket_timeout 1800 app.asgi:application

套接字每 30 分钟自动断开连接,但客户端永远不会知道这一点。

正确的方法是什么,.??

更新

尝试在连接关闭之前发送事件。我正在覆盖我的websocket_disconnect 处理程序,该处理程序在断开连接之前发送 json。但是,它不会发送事件。

class Consumer(AsyncJsonWebsocketConsumer):
    async def websocket_disconnect(self, message):
            """Over-riding."""
            print('Inside websocket_disconnect consumer')
            await self.send_json(
                "event": "disconnecting..."
            )
            await super().websocket_disconnect(message)

【问题讨论】:

    标签: django django-channels daphne


    【解决方案1】:

    我不确定这是一个需要解决的问题。客户端确定在 X 分钟不活动后它将断开连接,其中 X 由服务器确定。不确定在此之前不会发生。所以无论如何你都需要连接处理代码。

    虽然保持空闲连接看起来很脏,但我无法想象它会花费大量资源。

    您认为客户不了解它的前提是错误的。当您注册 onclose 处理程序时,客户端会收到一个断开连接事件并可以采取相应的行动。

    【讨论】:

    • 当python应用程序发送return self.send({'close': True})时,客户端确实收到了事件。但是,当达芙妮通过--websocket_timeout 1800 设置的 30 分钟后自动断开连接时,不会收到任何事件。
    • 我刚刚在设置为 30 秒和 5 秒的情况下对其进行了测试,因为我很不耐烦:)。像宣传的那样工作。但我使用的是 Daphne 2.5.0(还没有处理 BC 问题)。
    • 我可以在断开连接之前发送一个事件吗?更新我的代码,请看一下。
    • 你仍然假设发送了一些东西。我刚刚做了一个kill -KILL 9775,其中 9775 是 daphne 的 pid。这意味着 daphne 不能发送任何它想要发送的东西,因为 KILL 会突然终止。并触发了 onclose() 事件。所以也许是浏览器。我在 Mac 上使用最新的 Firefox。
    • 我现在明白了。非常感谢您的帮助。
    猜你喜欢
    • 2020-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-10
    相关资源
    最近更新 更多