如何处理Django频道中所有聊天的单个Websocket连接

时间:2019-02-02 09:33:41

标签: django websocket django-channels

我想制作一个类似WhatsApp的聊天应用程序,并且想要使用Django Channels处理所有实时更新来制作后端服务器。

我一直在探索各种资源,但是我无法弄清楚如何为每个用户管理单个websocket连接(单个端点),并且仍然实时接收他所参与的所有聊天消息。根据我目前的理解,我可以将频道(与用户对应的Web套接字连接)添加到不同的频道组中,但是如果用户是很多组的一部分(基本上有资格从各种聊天中接收更新),该怎么办?如果我将该频道添加到所有组中,则他可以在建立连接后立即加入其中,或者在我的脑海中有类似的解决方法:

  1. 将与每个用户相对应的频道列表存储在数据库中。
  2. 进行一个for循环,以便每当服务器接收到一条消息时,它就会将消息发送到与每个接收该消息的用户相对应的websocket连接?

感谢您的帮助。预先感谢。

1 个答案:

答案 0 :(得分:1)

是的,对于简单的聊天系统,您只需将用户的频道名称添加到他所订阅的群组中即可。

但是,对于更复杂的系统,您肯定需要在数据库中为聊天系统建模。假设您有一个模型Chat,ChatMember和Message。当用户连接到网络套接字时,他不需要指定任何聊天,因为它是常规连接。客户端发送的任何消息都必须指定聊天,因此您可以遍历聊天成员,并将消息转发给当前连接的所有人。

您如何知道当前连接的人?这是棘手的部分。在我的体系结构中,每个用户都有一个组,有点像一个收件箱。组名是根据用户ID生成的。每个用户都可以有多个连接,说手机,网络等从用户来的所有连接都被添加到用户组和用户的活动连接数被保存在收件箱模式。有了新的连接,它在断开连接时会递增或递减。

因此,要知道哪些聊天成员当前处于在线状态,我只需检查用户的收件箱是否具有至少一个连接即可。如果他在线,我会将邮件转发到他的ibox组,否则我会将邮件存储在他的收件箱中。每当用户连接时,都会向他发送收件箱中的所有消息,并清除收件箱。

这只是实现它的一种方式,但是您也可以考虑定制架构或对其进行改进。