使用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读写ini配置文件方法实例分析
Jun 30 Python
Python数据结构之双向链表的定义与使用方法示例
Jan 16 Python
python实现装饰器、描述符
Feb 28 Python
Python 实现异步调用函数的示例讲解
Oct 14 Python
python Selenium实现付费音乐批量下载的实现方法
Jan 24 Python
python代码 FTP备份交换机配置脚本实例解析
Aug 01 Python
Django Admin中增加导出Excel功能过程解析
Sep 04 Python
python带参数打包exe及调用方式
Dec 21 Python
Python模块 _winreg操作注册表
Feb 05 Python
jupyter notebook实现显示行号
Apr 13 Python
tensorflow 2.0模式下训练的模型转成 tf1.x 版本的pb模型实例
Jun 22 Python
Python3利用scapy局域网实现自动多线程arp扫描功能
Jan 21 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中static关键字原理的学习研究分析
2011/07/18 PHP
smarty模板中使用get、post、request、cookies、session变量的方法
2014/04/24 PHP
php获取根域名方法汇总
2014/10/28 PHP
php事务回滚简单实现方法示例
2017/03/28 PHP
JavaScript基本对象
2007/01/11 Javascript
关于javascript document.createDocumentFragment()
2009/04/04 Javascript
最新的10款jQuery内容滑块插件分享
2011/09/18 Javascript
Ajax请求在数据量大的时候出现超时的解决方法
2014/02/27 Javascript
基于JavaScript实现全屏透明遮罩div层锁屏效果
2016/01/26 Javascript
node.js实现登录注册页面
2017/04/08 Javascript
js CSS3实现卡牌旋转切换效果
2017/07/04 Javascript
详解webpack运行Babel教程
2018/06/13 Javascript
vue-cli的工程模板与构建工具详解
2018/09/27 Javascript
详解ES6 CLASS在微信小程序中的应用实例
2020/04/24 Javascript
微信小程序开发打开另一个小程序的实现方法
2020/05/17 Javascript
[01:10]DOTA2亚洲邀请赛 征战号角响彻全场
2015/01/06 DOTA
python中的函数用法入门教程
2014/09/02 Python
python实现字符串和日期相互转换的方法
2015/05/13 Python
Python语言的变量认识及操作方法
2018/02/11 Python
python实现一组典型数据格式转换
2018/12/15 Python
Django获取该数据的上一条和下一条方法
2019/08/12 Python
Pytorch之contiguous的用法
2019/12/31 Python
html通过canvas转成base64的方法
2019/07/18 HTML / CSS
香港现代设计家具品牌:Ziinlife Furniture
2018/11/13 全球购物
Pandora德国官网:购买潘多拉手链、戒指、项链和耳环
2020/02/20 全球购物
C#面试问题
2016/07/29 面试题
在求职信中如何凸显个人优势
2013/10/30 职场文书
生物医学工程专业学生求职信范文分享
2013/12/14 职场文书
医务人员自我评价
2014/01/26 职场文书
运动会解说词100字
2014/01/31 职场文书
老总助理工作岗位职责
2014/02/06 职场文书
人事专员工作职责
2014/02/22 职场文书
2014年技术工作总结范文
2014/11/20 职场文书
边城读书笔记
2015/06/29 职场文书
校园新闻稿范文
2015/07/18 职场文书
2019秋季运动会口号
2019/06/25 职场文书