【问题标题】:Django channels websocket reconnectDjango 通道 websocket 重新连接
【发布时间】:2020-07-17 03:21:42
【问题描述】:

我正在 Django 中构建一个消息传递系统,使用 web-socket 来接收消息。

这是我的试训,

from channels.consumer import AsyncConsumer
from channels.db import database_sync_to_async

class ChatConsumer(AsyncConsumer):

    async def websocket_connect(self, event):
        print("connected", event)
        await self.send({
            "type": "websocket.accept"
        })

    async def websocket_receive(self, event):
        print("receive", event)
        message = event['text']
        obj = await self.create_obj(message=message)
        print('Created...')

    async def websocket_disconnect(self, event):
        print("disconnected", event)

    @database_sync_to_async
    def create_obj(self, **kwargs):
        obj = ChatMessage.objects.create(message=kwargs['message'])
        return obj

当我启动客户端应用程序时,web-socket 已连接,我可以接收消息并且可以存储到数据库中。

connected {'type': 'websocket.connect'}
WebSocket CONNECT /ws/message [192.168.0.101:50148]

一段时间后,web-socket 会自动断开,

Application instance <Task pending coro=<SessionMiddlewareInstance.__call__() running at /Users/ajay/Desktop/workspace/projects/python/django/websock/venv/lib/python3.7/site-packages/channels/sessions.py:183> wait_for=<Future pending cb=[<TaskWakeupMethWrapper object at 0x10b311510>()]>> for connection <WebSocketProtocol client=['192.168.0.101', 50148] path=b'/ws/message'> took too long to shut down and was killed.

断开连接后,我无法收到消息,当我重新加载客户端时,web-socket 已连接,有什么方法可以自动重新连接 we-socket 而无需重新加载客户端。我要求指导我一些建议来实现这一目标,这对我很有帮助,在此先感谢。

【问题讨论】:

    标签: django websocket django-channels reconnect


    【解决方案1】:

    您的客户端似乎终止了连接。我在用作客户端导入 websockets 时遇到了同样的问题。

     # part of Client Code in the main while loop
     while not self.finished:
            try:
                self.websocket = await websockets.client.connect(
                    self.connect_url,
                    max_size=None,
                    extra_headers=self.extra_headers
                )
    .....
    # in your`s producer
    .......
     while True:
            # Make sure connection is still live.
            pong_waiter = await self.websocket.ping()
            await pong_waiter # if you will not await in 10-20 sec connection will close.
    

    【讨论】:

    • 感谢您的回复。但是很抱歉,我无法理解这一点,实际上我的客户是 Flutter(Android 应用程序),请您根据我的试用情况指导我。提前致谢
    猜你喜欢
    • 2019-05-31
    • 2023-02-25
    • 2021-03-07
    • 2019-05-28
    • 1970-01-01
    • 2020-03-04
    • 1970-01-01
    • 2020-11-30
    • 2022-10-13
    相关资源
    最近更新 更多