vue+django实现一对一聊天和消息推送的功能。主要是通过websocket,由于Django不支持websocket,所以我使用了django-channels。考虑到存储量的问题,我并没有把聊天信息存入数据库,服务端的作用相当于一个中转站。我只讲述实现功能的结构性代码,具体的实现还请大家看源代码。

效果展示

实现过程

后端

首先,我们需要先定义websocket的两条连接路径。ws/chat/xxx/(xxx指代聊天组)这条路径是当聊天双方都进入同一个聊天组以后,开始聊天的路径。push/xxx/(xxx指代用户名)这条是指当有一方不在聊天组,另一方的消息将通过这条路径推送给对方。ws/chat/xxx/只有双方都进入聊天组以后才开启,而push/xxx/是自用户登录以后,直至退出都开启的。

websocket_urlpatterns = [

url(r'^ws/chat/(?P[^/]+)/$', consumers.ChatConsumer),

url(r'^push/(?P[0-9a-z]+)/$', consumers.PushConsumer),

]

我们采用user_a的id加上下划线_加上user_b的id的方式来命名聊天组名。其中id值从小到大放置,例如:195752_748418。当用户通过ws/chat/group_name/的方式向服务端请求连接时,后端会把这个聊天组的信息放入一个字典里。当连接关闭时,就把聊天组从字典里移除。

class ChatConsumer(AsyncJsonWebsocketConsumer):

chats = dict()

async def connect(self):

self.group_name = self.scope['url_route']['kwargs']['group_name']

await self.channel_layer.group_add(self.group_name, self.channel_name)

# 将用户添加至聊天组信息chats中

try:

ChatConsumer.chats[self.group_name].add(self)

except:

ChatConsumer.chats[self.group_name] = set([self])

#print(ChatConsumer.chats)

# 创建连接时调用

await self.accept()

async def disconnect(self, close_code):

# 连接关闭时调用

# 将关闭的连接从群组中移除

await self.channel_layer.group_discard(self.group_name, self.channel_name)

# 将该客户端移除聊天组连接信息

ChatConsumer.chats[self.group_name].remove(self)

await self.close()

接着,我们需要判断连接这个聊天组的用户个数。当有两个用户连接这个聊天组时,我们就直接向这个聊天组发送信息。当只有一个用户连接这个聊天组时,我们就通过push/xxx/把信息发给接收方。

async def receive_json(self, message, **kwargs):

# 收到信息时调用

to_user = message.get('to_user')

# 信息发送

length = len(ChatConsumer.chats[self.group_name])

if length == 2:

await self.channel_layer.group_send(

self.group_name,

{

"type": "chat.message",

"message": message.get('message'),

},

)

else:

await self.channel_layer.group_send(

to_user,

{

"type": "push.message",

"event": {'message': message.get('message'), 'group': self.group_name}

},

)

async def chat_message(self, event):

# Handles the "chat.message" event when it's sent to us.

await self.send_json({

"message": event["message"],

})

# 推送consumer

class PushConsumer(AsyncWebsocketConsumer):

async def connect(self):

self.group_name = self.scope['url_route']['kwargs']['username']

await self.channel_layer.group_add(

self.group_name,

self.channel_name

)

await self.accept()

async def disconnect(self, close_code):

await self.channel_layer.group_discard(

self.group_name,

self.channel_name

)

# print(PushConsumer.chats)

async def push_message(self, event):

print(event)

await self.send(text_data=json.dumps({

"event": event['event']

}))

前端

前端实现websocket就比较简单了。就是对websocket进行初始化,定义当websocket连接、关闭和接收消息时要执行哪些动作。

export default {

name : 'test',

data() {

return {

websock: null,

}

},

created() {

this.initWebSocket();

},

destroyed() {

this.websock.close() //离开路由之后断开websocket连接

},

methods: {

initWebSocket(){ //初始化weosocket

const wsuri = "ws://127.0.0.1:8080";

this.websock = new WebSocket(wsuri);

this.websock.onmessage = this.websocketonmessage;

this.websock.onopen = this.websocketonopen;

this.websock.onerror = this.websocketonerror;

this.websock.onclose = this.websocketclose;

},

websocketonopen(){ //连接建立之后执行send方法发送数据

let actions = {"test":"12345"};

this.websocketsend(JSON.stringify(actions));

},

websocketonerror(){//连接建立失败重连

this.initWebSocket();

},

websocketonmessage(e){ //数据接收

const redata = JSON.parse(e.data);

},

websocketsend(Data){//数据发送

this.websock.send(Data);

},

websocketclose(e){ //关闭

console.log('断开连接',e);

},

},

}

参考文章

python实现一对一聊天_vue+django实现一对一聊天功能相关推荐

  1. vue+django实现一对一聊天功能

    vue+django实现一对一聊天和消息推送的功能.主要是通过websocket,由于Django不支持websocket,所以我使用了django-channels.考虑到存储量的问题,我并没有把聊 ...

  2. 借助云开发,利用订阅消息,云函数路由实现小程序好友一对一聊天,添加好友等仿微信功能

    微信小程序借助云开发,利用订阅消息,云函数路由实现小程序好友一对一聊天,添加好友等仿微信功能 这篇文章已经进行了更新,请点此进行查看 仿微信好友聊天 主要功能有 后续可能补充功能 详细介绍 注意 保存 ...

  3. python全栈生鲜电商_Vue+Django REST framework 打造生鲜电商项目(学习笔记一)

    1.环境搭建 所需软件的版本: 1)pycharm(使用professional版本) 2)mysql.navicat 安装好的mysql后需要给root权限,不然只能通过localhost访问本地的 ...

  4. 基于Python语言、RSA非对称加密的IRC聊天室客户端

    源码地址: (55条消息) 基于Python语言.RSA非对称加密的IRC聊天室客户端源码与应用程序-Python文档类资源-CSDN文库 1 研究背景和现状 IRC是Internet Relay C ...

  5. python学习第6天---django框架---模型类及数据库操作

    python学习第6天---django框架---模型类及数据库操作 目录 文章目录 1.字段与选项 2.查询函数 3.查询集 4.模型类之间的关系 4.1.对应关系 4.2.关联查询 5.模型管理器 ...

  6. 一对一交友源码,一对一视频交友源码,这些功能是主流

    市面上有许许多多的一对一交友APP,而通过一对一交友源码可以轻松实现这类社交交友平台的搭建,然而在功能选取和产品定位方面有时会让人犯难.随着视频直播和小视频的强势崛起,传统的一对一交友平台也在发生着悄 ...

  7. 一对一直播源码开发,一对一视频直播解决方案新思路

    随着传统秀场直播的普及,"直播+"开发热潮的来临,一对一直播俨然成为了直播行业又一火爆的应用领域.对于一对一直播的大胆尝试,让一对一直播有了极为广泛的应用场景,本篇内容为大家展示一 ...

  8. 一对一直播怎么开发?一对一直播app开发关键点

    一对一直播区别于以往我们所看到多直播平台,它更加侧重于陌生人社交,同时也属于内容付费直播范畴,除了在社交领域多应用之外,它也可以作为一种工具,应用于在线教育.在线医疗等应用场景. 一对一直播开发核心业 ...

  9. 一对一直播源码,一对一直播平台搭建,特色功能智能匹配

    一对多直播平台上,互动随着播主的火热程度下降,而一对一直播开发特性,让其具备社交互动,更是主打的聊天,在社交价值上显然一对一直播开发更具有想象的空间. 从一对一直播源码效果看一对一直播是全方位实时同步 ...

最新文章

  1. 中科院 工程硕士专业课 复试考试前的辅导安排
  2. java中min用法,java11教程--类MinguoDate用法
  3. 火狐自动换行 有空格
  4. Key Components and Internals of Spring Boot Framework--转
  5. Unrecognized Hadoop major version number: 3.0.0-cdh6.3.2
  6. TortoiseSVN无法查看日志和SVN LOG无法查看日志的解决办法。
  7. linux shell 变量减法_Linux Shell (3) - 变量运算
  8. 测试枕头软件,智能枕头:一款神器监测您的睡眠
  9. 将 75000 行原生 iOS 应用程序移植到 Flutter 后,结果太惊讶!
  10. Grafana v6.0.0 发布,系统指标监控与分析平台
  11. Modbus通讯协议学习 - 认识篇
  12. hibernate之多对多配置
  13. vscode百度网盘下载
  14. 如何实现EXCEL图表曲线纵坐标不从0开始
  15. LeedCode 376. 摆动序列
  16. 住房教育当从娃娃抓起
  17. 2022 年前端技术发展趋势知识小结
  18. 【题解】LuoGu1133:教主的花园
  19. python日期处理、groupby聚合、求最大值、方差
  20. 在Power BI中用DAX计算净现值NPV

热门文章

  1. 基于JAVA+SpringMVC+Mybatis+MYSQL的个人记账管理系统
  2. ASP.NET Core学习——6
  3. RAID 6 vs. RAID 10
  4. 数据库:mysql内置功能-函数
  5. Windows核心编程:第7章 线程调度、优先级和关联性
  6. java线程的小问题与回答
  7. input 对伪元素(:before :after)的支持情况
  8. MapReduce框架在Yarn上的具体解释
  9. Java构造方法的继承调用
  10. Api demo源码学习(4)--App/Activity/Dialog --Activity以Dialog形式呈现