使用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 相关文章推荐
python中的对象拷贝示例 python引用传递
Jan 23 Python
python中文编码问题小结
Sep 28 Python
关于python的bottle框架跨域请求报错问题的处理方法
Mar 19 Python
Linux RedHat下安装Python2.7开发环境
May 20 Python
python matplotlib 注释文本箭头简单代码示例
Jan 08 Python
Python3.5内置模块之time与datetime模块用法实例分析
Apr 27 Python
Dlib+OpenCV深度学习人脸识别的方法示例
May 14 Python
Python实现使用request模块下载图片demo示例
May 24 Python
大家都说好用的Python命令行库click的使用
Nov 07 Python
python文件处理fileinput使用方法详解
Jan 02 Python
python实现在一个画布上画多个子图
Jan 19 Python
Python paramiko 模块浅谈与SSH主要功能模拟解析
Feb 29 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多态的实现详解
2013/06/09 PHP
php以post形式发送xml的方法
2014/11/04 PHP
反射调用private方法实践(php、java)
2015/12/21 PHP
WordPress特定文章对搜索引擎隐藏或只允许搜索引擎查看
2015/12/31 PHP
对于Laravel 5.5核心架构的深入理解
2018/02/22 PHP
PHP两个n位的二进制整数相加问题的解决
2018/08/26 PHP
php JWT在web端中的使用方法教程
2018/09/06 PHP
js直接编辑当前cookie的脚本
2008/09/14 Javascript
不要在cookie中使用特殊字符的原因分析
2010/07/13 Javascript
JS实现self的resend
2010/07/22 Javascript
热点新闻滚动特效的js代码
2013/08/17 Javascript
使用js如何实现全选与全不选
2013/12/30 Javascript
一些老手都不一定知道的JavaScript技巧
2014/05/06 Javascript
浅析webapp框架AngularUI的demo
2014/12/21 Javascript
使用BootStrap实现用户登录界面UI
2016/08/10 Javascript
jquery easyui validatebox remote的使用详解
2016/11/09 Javascript
JavaScript中数据类型转换总结
2016/12/25 Javascript
Easyui和zTree两种方式分别实现树形下拉框
2017/08/04 Javascript
Vue.js搭建移动端购物车界面
2020/06/28 Javascript
深入理解javascript prototype的相关知识
2019/09/19 Javascript
[48:38]DOTA2亚洲邀请赛 3.31 小组赛 B组 Mineski vs Secret
2018/03/31 DOTA
[01:01:41]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Magma BO3 第二场 1月31日
2021/03/11 DOTA
使用Node.js和Socket.IO扩展Django的实时处理功能
2015/04/20 Python
Python创建对称矩阵的方法示例【基于numpy模块】
2017/10/12 Python
Python常用模块之requests模块用法分析
2019/05/15 Python
关于tf.nn.dynamic_rnn返回值详解
2020/01/20 Python
python生成xml时规定dtd实例方法
2020/09/21 Python
python之openpyxl模块的安装和基本用法(excel管理)
2021/02/03 Python
岗位职责范本
2013/11/23 职场文书
如何打造一封优秀的留学推荐信
2014/01/25 职场文书
行政工作个人的自我评价
2014/02/13 职场文书
离婚协议书怎么写(范本参考)
2014/09/30 职场文书
红色革命电影观后感
2015/06/18 职场文书
建议书的格式及范文
2015/09/14 职场文书
详解Python如何批量采集京东商品数据流程
2022/01/22 Python
MySQL数据库查询进阶之多表查询详解
2022/04/08 MySQL