使用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中操作字符串之startswith()方法的使用
May 20 Python
python定时利用QQ邮件发送天气预报的实例
Nov 17 Python
利用信号如何监控Django模型对象字段值的变化详解
Nov 27 Python
Python用csv写入文件_消除空余行的方法
Jul 06 Python
对python字典元素的添加与修改方法详解
Jul 06 Python
Python实现高斯函数的三维显示方法
Dec 29 Python
Python3实现从排序数组中删除重复项算法分析
Apr 03 Python
Python 用matplotlib画以时间日期为x轴的图像
Aug 06 Python
python使用梯度下降算法实现一个多线性回归
Mar 24 Python
Python命令行参数定义及需要注意的地方
Nov 30 Python
python 爬取腾讯视频评论的实现步骤
Feb 18 Python
Python中 range | np.arange | np.linspace三者的区别
Mar 22 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 strtotime 函数UNIX时间戳
2009/01/14 PHP
PHP中shuffle数组值随便排序函数用法
2014/11/21 PHP
PHP针对JSON操作实例分析
2015/01/12 PHP
JavaScript更改原始对象valueOf的方法
2015/03/19 Javascript
javascript处理a标签超链接默认事件的方法
2015/06/29 Javascript
JS实现可直接显示网页代码运行效果的HTML代码预览功能实例
2015/08/06 Javascript
简单的jQuery banner图片轮播实例代码
2016/03/04 Javascript
JS中多步骤多分步的StepJump组件实例详解
2016/04/01 Javascript
jQuery 获取遍历获取table中每一个tr中的第一个td的方法
2016/10/05 Javascript
vue发送websocket请求和http post请求的实例代码
2019/07/11 Javascript
express框架中使用jwt实现验证的方法
2019/08/25 Javascript
JavaScript数组排序功能简单实现
2020/05/14 Javascript
vue+koa2搭建mock数据环境的详细教程
2020/05/18 Javascript
[01:20]DOTA2 齐天大圣至宝动态展示
2016/12/13 DOTA
python之文件的读写和文件目录以及文件夹的操作实现代码
2016/08/28 Python
Python 12306抢火车票脚本 Python京东抢手机脚本
2018/02/06 Python
python爬取m3u8连接的视频
2018/02/28 Python
解决Python安装后pip不能用的问题
2018/06/12 Python
Python 从一个文件中调用另一个文件的类方法
2019/01/10 Python
对python判断ip是否可达的实例详解
2019/01/31 Python
Python字节单位转换实例
2019/12/05 Python
Python实现bilibili时间长度查询的示例代码
2020/01/14 Python
django2.2 和 PyMySQL版本兼容问题
2020/02/17 Python
pycharm开发一个简单界面和通用mvc模板(操作方法图解)
2020/05/27 Python
Python 多线程C段扫描、检测 Ping扫描脚本的实现
2020/09/03 Python
Python中免验证跳转到内容页的实例代码
2020/10/23 Python
python爬取代理ip的示例
2020/12/18 Python
人民教师的自我评价分享
2014/02/21 职场文书
工程安全员岗位职责
2014/03/09 职场文书
演讲稿祖国在我心中
2014/05/04 职场文书
检查机关党的群众路线个人整改措施
2014/10/04 职场文书
新郎答谢词
2015/01/04 职场文书
法定代表人身份证明书
2015/06/18 职场文书
Python 数据科学 Matplotlib图库详解
2021/07/07 Python
Python超详细分步解析随机漫步
2022/03/17 Python
Pillow图像处理库安装及使用
2022/04/12 Python