做项目的时候涉及到即时通信了,所以在 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通过字段userwho找到对应chat_achat = coll.find_one({“user”:user_a[‘id’], “who”:user_b[‘id’]});如果该chat不存在,则利用双方id创建chat_a

发送消息(更新chat_achat_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的好友一对一聊天功能相关推荐

  1. WebSocket(3)---实现一对一聊天功能

    实现一对一聊天功能 功能介绍:实现A和B单独聊天功能,即A发消息给B只能B接收,同样B向A发消息只能A接收. 本篇博客是在上一遍基础上搭建,上一篇博客地址:[WebSocket]---实现游戏公告功能 ...

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

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

  3. swoole+websocket+redis实现一对一聊天

    如同web端的QQ和微信一样,这是一个web端的聊天程序. 环境:ubuntu + php + swoole扩展 + redis + mysql Redis 实现每个连接websocket的服务都唯一 ...

  4. python实现一对一聊天_vue+django实现一对一聊天功能

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

  5. 基于环信实现在线聊天功能

    由于最近接触到的项目需要用到聊天功能,关于聊天的SDK跟安卓同事统一,最终选择了环信.在官方下载好SDK,并研究了一波,最终实现自定义聊天功能. ###实现前准备 1.下载环信SDK,我使用的版本是V ...

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

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

  7. 习惯了微信聊天,利用WebSocket手动实现个聊天功能怎么样?

    1.背景 基于项目需求,最近需要实现一个简单的聊天功能.日常生活中,大家对于聊天也习以为常,微信.QQ等软件也经常用到,其实我们也可以引入一些第三方的sdk包等去实现,也可以利用WebSocket通信 ...

  8. 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 = ...

  9. Golang实现基于Websocket协议的H5聊天室

    http://www.cnblogs.com/wangrudong003/p/5535689.html 关注公众号 风色年代(itfantasycc) 300G Golang微服务资料等你拿! go代 ...

最新文章

  1. 操作系统学习笔记 第一章:操作系统概述(王道考研)
  2. QEMU — I/O QoS 的实现方式
  3. shell实现统计浏览次数并将结果保存到文件中
  4. 添加nginx为系统服务(service nginx start/stop/restart)
  5. python 对excel文件进行分词并进行词频统计_教你背单词 | 利用python分析考研英语阅读并生成词频降序表...
  6. C#中Tuple的使用
  7. IDEA Java Web 推送Tomcat
  8. 泰晤士“中国学科评级”结果出炉,中国数学学科评级榜单公示!
  9. Eigen中的map
  10. json输出count如何计算_基于 Kafka + Flink + Redis 的电商大屏实时计算案例
  11. 下一站,北京-欢乐谷
  12. Flash Builder 的概要分析
  13. 【线性回归】-最小二乘法求一元线性回归公式推导及代码实现
  14. 天线方向图仿真(面阵、圆阵、圆环阵)matlab
  15. 音频在计算机里存储形式是什么,如何在录音带上存储任何类型的文件
  16. 【论文】Deep Pyramidal Residual Networks(译)
  17. 一加和小米哪个好 一加用技术领先树立起品牌典范
  18. Outfit7 庆祝其开发工作大获丰收
  19. dz论坛 修改用户名
  20. 常用的javascript实例

热门文章

  1. MySQL 查询部门人数大于2的员工信息
  2. Varnish的相关知识,varnish的简单应用
  3. 安装System Center 2012 R2 数据库
  4. 测试网内主机存活状态
  5. linux 系统让服务后台运行
  6. 《Java线程池》:任务拒绝策略
  7. ApplicationContext接口不同应用场景的实现
  8. vue项目中的“Invalid Host header”
  9. 英语数字的 android,英语数字听力学霸APP
  10. MySQL为什么用 B+ 树,不用 B 树?