使用Python的Tornado框架实现一个一对一聊天的程序


Posted in Python onApril 25, 2015

按思路来聊:

类似微信,点击用户可以进入一对一聊天页面;另有聊天框列表包含所有存在聊天记录的一对一聊天框,点击进入聊天页面。
【数据结构】

因为双方都有聊天记录,所以每一个聊天实际上得储存两份,设计的数据结构如下:

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)
  #不存在则创建会话,并将当前用户添加进去
  else
    SocketHandler.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函数中的方法构造key
  if key in SocketHandler.chats:
    SocketHandler.chats[key].remove(self)#删除当前连接
    if len(SocketHandler.chats[key]) == 0:
      del SocketHandler.chats[key]#当会话无连接者则删除会话

经过上面的改造,就实现多个一对一聊天功能

Python 相关文章推荐
Python3控制路由器——使用requests重启极路由.py
May 11 Python
通过Python爬虫代理IP快速增加博客阅读量
Dec 14 Python
详解python中的线程
Feb 10 Python
python用户管理系统
Mar 13 Python
详解python单元测试框架unittest
Jul 02 Python
python爬虫-模拟微博登录功能
Sep 12 Python
Python django搭建layui提交表单,表格,图标的实例
Nov 18 Python
Python3的socket使用方法详解
Feb 18 Python
python实现简单学生信息管理系统
Apr 09 Python
在Tensorflow中实现leakyRelu操作详解(高效)
Jun 30 Python
分享PyCharm最新激活码(真永久激活方法)不用每月找安装参数或最新激活码了
Dec 27 Python
python pygame 开发五子棋双人对弈
May 02 Python
使用Python发送邮件附件以定时备份MySQL的教程
Apr 25 #Python
安装Python的web.py框架并从hello world开始编程
Apr 25 #Python
用Python编写一个基于终端的实现翻译的脚本
Apr 24 #Python
Python的Bottle框架中获取制定cookie的教程
Apr 24 #Python
利用Python的装饰器解决Bottle框架中用户验证问题
Apr 24 #Python
在Python中使用mongoengine操作MongoDB教程
Apr 24 #Python
python使用arp欺骗伪造网关的方法
Apr 24 #Python
You might like
说明的比较细的php 正则学习实例
2008/07/30 PHP
PHP之浮点数计算比较以及取整数不准确的解决办法
2015/07/29 PHP
WordPress中调试缩略图的相关PHP函数使用解析
2016/01/07 PHP
php strftime函数获取日期时间(switch用法)
2018/05/16 PHP
PHP封装的非对称加密RSA算法示例
2018/05/28 PHP
控制打印时页眉角的代码
2007/02/08 Javascript
JS的递增/递减运算符和带操作的赋值运算符的等价式
2007/12/08 Javascript
在jquery中处理带有命名空间的XML数据
2011/06/13 Javascript
javascript 文本框水印/占位符(watermark/placeholder)实现方法
2012/01/15 Javascript
jQuery弹出层始终垂直居中相对于屏幕或当前窗口
2013/04/01 Javascript
jQuery链式调用与show知识浅析
2016/05/11 Javascript
用jQuery获取table中行id和td值的实现代码
2016/05/19 Javascript
vue使用watch 观察路由变化,重新获取内容
2017/03/08 Javascript
Angular2实现自定义双向绑定属性
2017/03/22 Javascript
javascript中mouseenter与mouseover的异同
2017/06/06 Javascript
JavaScript字符串转数字的5种方法及遇到的坑
2018/07/16 Javascript
vue-cli的工程模板与构建工具详解
2018/09/27 Javascript
解决微信小程序调用moveToLocation失效问题【超简单】
2019/04/12 Javascript
js字符串类型String常用操作实例总结
2019/07/05 Javascript
WEEX环境搭建与入门详解
2019/10/16 Javascript
使用Python写一个量化股票提醒系统
2018/08/22 Python
python遍历小写英文字母的方法
2019/01/02 Python
Python eval的常见错误封装及利用原理详解
2019/03/26 Python
scrapy-redis源码分析之发送POST请求详解
2019/05/15 Python
pandas的to_datetime时间转换使用及学习心得
2019/08/11 Python
Tensorflow限制CPU个数实例
2020/02/06 Python
python中with用法讲解
2020/02/07 Python
Python中使用filter过滤列表的一个小技巧分享
2020/05/02 Python
Python如何合并多个字典或映射
2020/07/24 Python
DRF框架API版本管理实现方法解析
2020/08/21 Python
美国主要的特色咖啡和茶公司:Peet’s Coffee
2020/02/14 全球购物
美国踏板车和轻便摩托车销售网站:Mega Motor Madness
2020/02/26 全球购物
2014年校务公开工作总结
2014/12/18 职场文书
课改心得体会范文
2016/01/25 职场文书
初三语文教学反思
2016/03/03 职场文书
Python中rapidjson参数校验实现
2021/07/25 Python