使用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的while循环中使用else以及循环嵌套的用法
Oct 14 Python
Python中datetime模块参考手册
Jan 13 Python
关于python的bottle框架跨域请求报错问题的处理方法
Mar 19 Python
Python实现发送与接收邮件的方法详解
Mar 28 Python
DataFrame 将某列数据转为数组的方法
Apr 13 Python
python:接口间数据传递与调用方法
Dec 17 Python
Python3.5基础之变量、数据结构、条件和循环语句、break与continue语句实例详解
Apr 26 Python
关于django 1.10 CSRF验证失败的解决方法
Aug 31 Python
python3获取文件中url内容并下载代码实例
Dec 27 Python
python数据库编程 ODBC方式实现通讯录
Mar 27 Python
Python虚拟环境venv用法详解
May 25 Python
基于python实现ROC曲线绘制广场解析
Jun 28 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
关于时间计算的结总
2006/12/06 PHP
php mssql 日期出现中文字符的解决方法
2009/03/10 PHP
PHP Undefined index报错的修复方法
2011/07/17 PHP
php数组函数序列之array_keys() - 获取数组键名
2011/10/30 PHP
php字符串分割函数explode的实例代码
2013/02/07 PHP
CodeIgniter CLI模式简介
2014/06/17 PHP
PHP面向对象程序设计高级特性详解(接口,继承,抽象类,析构,克隆等)
2016/12/02 PHP
jQuery学习总结之jQuery事件
2014/06/30 Javascript
基于JavaScript怎么实现让歌词滚动播放
2015/11/03 Javascript
如何检测JavaScript的各种类型
2016/07/30 Javascript
js绘制购物车抛物线动画
2020/11/18 Javascript
详解 vue.js用法和特性
2017/10/15 Javascript
基于nodejs实现微信支付功能
2017/12/20 NodeJs
React BootStrap用户体验框架快速上手
2018/03/06 Javascript
vue 实现axios拦截、页面跳转和token 验证
2018/07/17 Javascript
vue2.0实现的tab标签切换效果(内容可自定义)示例
2019/02/11 Javascript
JS实现打字游戏
2019/12/17 Javascript
JS代码触发事件代码实例
2020/01/02 Javascript
vue实践---vue不依赖外部资源实现简单多语操作
2020/09/21 Javascript
[02:42]2014DOTA2国际邀请赛 三冰专访:我会打到Ti20
2014/07/13 DOTA
[01:12:44]VG vs Mineski Supermajor 败者组 BO3 第二场 6.6
2018/06/07 DOTA
[58:00]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant BO3 第二场 2月7日
2021/03/11 DOTA
举例讲解如何在Python编程中进行迭代和遍历
2016/01/19 Python
Java实现的执行python脚本工具类示例【使用jython.jar】
2018/03/29 Python
Python列表推导式与生成器用法分析
2018/08/02 Python
Python多进程池 multiprocessing Pool用法示例
2018/09/07 Python
对python指数、幂数拟合curve_fit详解
2018/12/29 Python
Python实现一个带权无回置随机抽选函数的方法
2019/07/24 Python
flask框架配置mysql数据库操作详解
2019/11/29 Python
如何使用localstorage代替cookie实现跨域共享数据问题
2018/04/18 HTML / CSS
HTML5 图片悬停放大的实现代码示例
2019/12/04 HTML / CSS
alice McCALL官网:澳大利亚时尚品牌
2020/11/16 全球购物
建筑专业自我鉴定
2013/10/22 职场文书
卫生巾广告词
2014/03/18 职场文书
2015年财政所工作总结
2015/04/25 职场文书
同意报考公务员证明
2015/06/17 职场文书