用于聊天应用程序的多个 websocket 实例

multiple websocket instances for chat application

我正在构建一个 Django-Vue 聊天应用程序,我已经构建了该应用程序的核心功能。

安装 SideBar 组件后,会发出 HTTP 请求以获取用户参与的所有房间,当单击某个房间时,会在聊天组件上创建 WebSocket 实例。

我的疑问是,如果我向那个房间发送消息,但其他用户未在同一房间连接(假设他们在其他房间连接),他们将不会收到消息,对吗?那么我如何向他发送有关新消息的通知?比如 Whatsapp 侧边栏通知。

我想创建两个 WebSocket 连接,一个在 SideBar 上作为用户端点 (ws:127.0.0.1:8000/chat/$Username),另一个用于实际的聊天室 (ws:127.0.0.1:8000/chat/$ChatId),这样好吗方法?

我的 django 模型 =>

from django.db import models
from account.models import CustomUser

class Message(models.Model):
    sender = models.ForeignKey(CustomUser, on_delete=models.CASCADE, related_name='messages')
    message = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f'message from {self.sender.username}'

class Chat(models.Model):
    name = models.CharField(max_length=24)
    participants = models.ManyToManyField(CustomUser, blank=True)
    messages = models.ManyToManyField(Message, blank=True)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.name

您可以使用 WSS 作为传输层,但实现您自己的逻辑协议。

当然,您可以使用多个连接,但这是多余的。 让我们使用类似“事件”的东西。 例如,对于连接到聊天室的用户,您可以发送“连接”事件:

{
    "event": "connection",
    "user": {
        "id": 1,
        "username": "Foo",
        ...
    }
}

您可以通过简单的方法处理此类事件:

if event == "connection":
    ...
elif event == "exit":
elif event == "message":
...

同样的方法,但在客户端使用 JS 代码。

因此您只能为 Vue 应用程序和 Django 处理一个连接。