tornado实现基于websocket的好友一对一聊天功能
做项目的时候涉及到即时通信了,所以在 gladuo 的建议下看了一篇教程,【转】Tornado 搭建基于 WebSocket 的聊天服务,经过一番修改调试实现了功能,在此总结分享一下。
按思路来聊:
类似微信,点击用户可以进入一对一聊天页面;另有聊天框列表包含所有存在聊天记录的一对一聊天框,点击进入聊天页面。
【数据结构】
因为双方都有聊天记录,所以每一个聊天实际上得储存两份,设计的数据结构如下:
A :user_a = {“id”:1,”name”:”A”}
B :user_b = {“id”:2,”name”:”B”}
A的聊天记录:chat_a = { “id”:1, “user”:1, “who”:2, “name”:”B”, “new”:0, msg:[]}
B的聊天记录:chat_b = { “id”:2, “user”:2, “who”:1, “name”:”A”, “new”:0, msg:[]}
msg
实际上是个list
,结构如下:msg = { “user”:发送者id, “name”:发送者name, “date”:发送时间, “content”:消息内容 }
【业务逻辑】
当A
点击好友列表中B
的名字–>进入聊天框(根据双方id
通过字段user
、who
找到对应chat_a
,chat = coll.find_one({“user”:user_a[‘id’], “who”:user_b[‘id’]});
如果该chat
不存在,则利用双方id
创建chat_a
)
发送消息(更新chat_a
和chat_b
,如果chat_b
不存在则创建chat_b
;如果chat_b
不在线则更新chat_b[‘new’] = 1
)
A
删除聊天框(删除chat_a
)
【记录客户端连接】
由于是多个一对一聊天,所以不能直接用教程里的set
来记录连接。
最后的决定是用一个 dict
,用双方用户id
拼接的字符串作为key
,用list
存客户端连接。
...SocketHandler(...):chats = dict()
...
def on_open(self):...#通过双方id来生成一个独一无二的字符串min = user_a['id']max = user_b['id']if min >max:max = user_a['id']min = user_b['id']key = str(user_a['id'])+"_"+str(user_b['id'])#判断当前会话是否存在,存在则添加当前用户if key in chats:SocketHandler.chats[key].append(self)#不存在则创建会话,并将当前用户添加进去elseSocketHandler.chats[key] = [self]
【发送消息】
从客户端调用send
函数,在服务端on_message
函数中接受参数后更新双方聊天记录。之后调用send_to_all(key, message)
来更新聊天窗口。
【发通知/更新聊天窗口】
更新数据库里的聊天记录后还要在聊天窗口更新html
,所以需要通知该会话的连接者。
根据我们记录连接者的方式,对应的通知函数如下:
def send_to_all(key,message):for user in SocketHandler.chats[key]:user.write_message(json.dumps(message))
【关闭连接】
根据我们记录连接者的方式,对应的关闭函数如下:
def on_close(self):...#用on_open函数中的方法构造keyif key in SocketHandler.chats:SocketHandler.chats[key].remove(self)#删除当前连接if len(SocketHandler.chats[key]) == 0:del SocketHandler.chats[key]#当会话无连接者则删除会话
经过上面的改造,就实现多个一对一聊天功能
tornado实现基于websocket的好友一对一聊天功能相关推荐
- WebSocket(3)---实现一对一聊天功能
实现一对一聊天功能 功能介绍:实现A和B单独聊天功能,即A发消息给B只能B接收,同样B向A发消息只能A接收. 本篇博客是在上一遍基础上搭建,上一篇博客地址:[WebSocket]---实现游戏公告功能 ...
- 借助云开发,利用订阅消息,云函数路由实现小程序好友一对一聊天,添加好友等仿微信功能
微信小程序借助云开发,利用订阅消息,云函数路由实现小程序好友一对一聊天,添加好友等仿微信功能 这篇文章已经进行了更新,请点此进行查看 仿微信好友聊天 主要功能有 后续可能补充功能 详细介绍 注意 保存 ...
- swoole+websocket+redis实现一对一聊天
如同web端的QQ和微信一样,这是一个web端的聊天程序. 环境:ubuntu + php + swoole扩展 + redis + mysql Redis 实现每个连接websocket的服务都唯一 ...
- python实现一对一聊天_vue+django实现一对一聊天功能
vue+django实现一对一聊天和消息推送的功能.主要是通过websocket,由于Django不支持websocket,所以我使用了django-channels.考虑到存储量的问题,我并没有把聊 ...
- 基于环信实现在线聊天功能
由于最近接触到的项目需要用到聊天功能,关于聊天的SDK跟安卓同事统一,最终选择了环信.在官方下载好SDK,并研究了一波,最终实现自定义聊天功能. ###实现前准备 1.下载环信SDK,我使用的版本是V ...
- vue+django实现一对一聊天功能
vue+django实现一对一聊天和消息推送的功能.主要是通过websocket,由于Django不支持websocket,所以我使用了django-channels.考虑到存储量的问题,我并没有把聊 ...
- 习惯了微信聊天,利用WebSocket手动实现个聊天功能怎么样?
1.背景 基于项目需求,最近需要实现一个简单的聊天功能.日常生活中,大家对于聊天也习以为常,微信.QQ等软件也经常用到,其实我们也可以引入一些第三方的sdk包等去实现,也可以利用WebSocket通信 ...
- websocket多人聊天php,php-notes/基于websocket实现多人聊天室.md at master · dd-code-site/php-notes · GitHub...
WebSocket 连接 断开 格式:ws://IP或域名:端口 发送 消息 var websocket; var wsUrl; function connect() { try { wsUrl = ...
- Golang实现基于Websocket协议的H5聊天室
http://www.cnblogs.com/wangrudong003/p/5535689.html 关注公众号 风色年代(itfantasycc) 300G Golang微服务资料等你拿! go代 ...
最新文章
- 操作系统学习笔记 第一章:操作系统概述(王道考研)
- QEMU — I/O QoS 的实现方式
- shell实现统计浏览次数并将结果保存到文件中
- 添加nginx为系统服务(service nginx start/stop/restart)
- python 对excel文件进行分词并进行词频统计_教你背单词 | 利用python分析考研英语阅读并生成词频降序表...
- C#中Tuple的使用
- IDEA Java Web 推送Tomcat
- 泰晤士“中国学科评级”结果出炉,中国数学学科评级榜单公示!
- Eigen中的map
- json输出count如何计算_基于 Kafka + Flink + Redis 的电商大屏实时计算案例
- 下一站,北京-欢乐谷
- Flash Builder 的概要分析
- 【线性回归】-最小二乘法求一元线性回归公式推导及代码实现
- 天线方向图仿真(面阵、圆阵、圆环阵)matlab
- 音频在计算机里存储形式是什么,如何在录音带上存储任何类型的文件
- 【论文】Deep Pyramidal Residual Networks(译)
- 一加和小米哪个好 一加用技术领先树立起品牌典范
- Outfit7 庆祝其开发工作大获丰收
- dz论坛 修改用户名
- 常用的javascript实例