websocket群聊实战

发布时间 2023-04-30 18:15:47作者: Wchime
  • 演示及源码地址:

    演示地址:https://www.wchime.xyz/#/

    后端代码:https://gitee.com/mom925/wchime-web-api

    前端代码:https://gitee.com/mom925/uniapp-web

  • 项目说明

    项目技术:django+mysql+uwsgi+nginx+uniapp

    逻辑:以django搭建一个websocket服务器,前端用户连接websocket,进入同一群聊实现在线实时聊天

    演示图:

               

  •  主要代码说明

 

    搭建websocket代码

    

from channels.generic.websocket import WebsocketConsumer
from channels.exceptions import StopConsumer
from asgiref.sync import async_to_sync
import json


class RollCallConsumer(WebsocketConsumer):
    def websocket_connect(self, message):
        # 接收这个客户端的连接
        self.accept()
        # 将这个客户端的连接对象加入到某个地方(内存 or redis)1314 是群号这里写死了
        async_to_sync(self.channel_layer.group_add)('1314', self.channel_name)

    def websocket_receive(self, message):
        # 浏览器基于websocket向后端发送数据,自动触发接收消息
        # data = json.loads(message['text'])
        # chat_type = data.get('chat_type')
        # chat_id = data.get('chat_id')
        # chat_content = data.get('message')
        # print('chat_type', chat_type)
        # if chat_type == 'add_chat':
        #     async_to_sync(self.channel_layer.group_add)(chat_id, self.channel_name)

        # 通知组内的所有客户端,执行 chat_message 方法,在此方法中自己可以去定义任意的功能。

        async_to_sync(self.channel_layer.group_send)('1314', {"type": 'chat.message', 'message': message})

    # 这个方法对应上面的type,意为向1314组中的所有对象发送信息
    # 回调的方法
    def chat_message(self, event):
        text = event['message']['text']
        self.send(text)

    def websocket_disconnect(self, message):
        data = json.loads(message['text', '{}'])
        chat_id = data.get('chat_id')
        # 断开链接要将这个对象从 channel_layer 中移除
        async_to_sync(self.channel_layer.group_discard)(chat_id, self.channel_name)
        raise StopConsumer()

 

  django项目此时需要以asgi启动websocket,部署后可用daphne启动asgi