python实现一对一聊天_vue+django实现一对一聊天功能
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实现一对一聊天功能相关推荐
- vue+django实现一对一聊天功能
vue+django实现一对一聊天和消息推送的功能.主要是通过websocket,由于Django不支持websocket,所以我使用了django-channels.考虑到存储量的问题,我并没有把聊 ...
- 借助云开发,利用订阅消息,云函数路由实现小程序好友一对一聊天,添加好友等仿微信功能
微信小程序借助云开发,利用订阅消息,云函数路由实现小程序好友一对一聊天,添加好友等仿微信功能 这篇文章已经进行了更新,请点此进行查看 仿微信好友聊天 主要功能有 后续可能补充功能 详细介绍 注意 保存 ...
- python全栈生鲜电商_Vue+Django REST framework 打造生鲜电商项目(学习笔记一)
1.环境搭建 所需软件的版本: 1)pycharm(使用professional版本) 2)mysql.navicat 安装好的mysql后需要给root权限,不然只能通过localhost访问本地的 ...
- 基于Python语言、RSA非对称加密的IRC聊天室客户端
源码地址: (55条消息) 基于Python语言.RSA非对称加密的IRC聊天室客户端源码与应用程序-Python文档类资源-CSDN文库 1 研究背景和现状 IRC是Internet Relay C ...
- python学习第6天---django框架---模型类及数据库操作
python学习第6天---django框架---模型类及数据库操作 目录 文章目录 1.字段与选项 2.查询函数 3.查询集 4.模型类之间的关系 4.1.对应关系 4.2.关联查询 5.模型管理器 ...
- 一对一交友源码,一对一视频交友源码,这些功能是主流
市面上有许许多多的一对一交友APP,而通过一对一交友源码可以轻松实现这类社交交友平台的搭建,然而在功能选取和产品定位方面有时会让人犯难.随着视频直播和小视频的强势崛起,传统的一对一交友平台也在发生着悄 ...
- 一对一直播源码开发,一对一视频直播解决方案新思路
随着传统秀场直播的普及,"直播+"开发热潮的来临,一对一直播俨然成为了直播行业又一火爆的应用领域.对于一对一直播的大胆尝试,让一对一直播有了极为广泛的应用场景,本篇内容为大家展示一 ...
- 一对一直播怎么开发?一对一直播app开发关键点
一对一直播区别于以往我们所看到多直播平台,它更加侧重于陌生人社交,同时也属于内容付费直播范畴,除了在社交领域多应用之外,它也可以作为一种工具,应用于在线教育.在线医疗等应用场景. 一对一直播开发核心业 ...
- 一对一直播源码,一对一直播平台搭建,特色功能智能匹配
一对多直播平台上,互动随着播主的火热程度下降,而一对一直播开发特性,让其具备社交互动,更是主打的聊天,在社交价值上显然一对一直播开发更具有想象的空间. 从一对一直播源码效果看一对一直播是全方位实时同步 ...
最新文章
- 中科院 工程硕士专业课 复试考试前的辅导安排
- java中min用法,java11教程--类MinguoDate用法
- 火狐自动换行 有空格
- Key Components and Internals of Spring Boot Framework--转
- Unrecognized Hadoop major version number: 3.0.0-cdh6.3.2
- TortoiseSVN无法查看日志和SVN LOG无法查看日志的解决办法。
- linux shell 变量减法_Linux Shell (3) - 变量运算
- 测试枕头软件,智能枕头:一款神器监测您的睡眠
- 将 75000 行原生 iOS 应用程序移植到 Flutter 后,结果太惊讶!
- Grafana v6.0.0 发布,系统指标监控与分析平台
- Modbus通讯协议学习 - 认识篇
- hibernate之多对多配置
- vscode百度网盘下载
- 如何实现EXCEL图表曲线纵坐标不从0开始
- LeedCode 376. 摆动序列
- 住房教育当从娃娃抓起
- 2022 年前端技术发展趋势知识小结
- 【题解】LuoGu1133:教主的花园
- python日期处理、groupby聚合、求最大值、方差
- 在Power BI中用DAX计算净现值NPV
热门文章
- 基于JAVA+SpringMVC+Mybatis+MYSQL的个人记账管理系统
- ASP.NET Core学习——6
- RAID 6 vs. RAID 10
- 数据库:mysql内置功能-函数
- Windows核心编程:第7章 线程调度、优先级和关联性
- java线程的小问题与回答
- input 对伪元素(:before :after)的支持情况
- MapReduce框架在Yarn上的具体解释
- Java构造方法的继承调用
- Api demo源码学习(4)--App/Activity/Dialog --Activity以Dialog形式呈现