使用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 调用VC++的动态链接库(DLL)
Sep 06 Python
Python列出一个文件夹及其子目录的所有文件
Jun 30 Python
Python中的os.path路径模块中的操作方法总结
Jul 07 Python
Python 实现一个颜色色值转换的小工具
Dec 06 Python
解决Pandas to_json()中文乱码,转化为json数组的问题
May 10 Python
Python numpy.array()生成相同元素数组的示例
Nov 12 Python
解决Pandas的DataFrame输出截断和省略的问题
Feb 08 Python
详解Python爬取并下载《电影天堂》3千多部电影
Apr 26 Python
python从入门到精通 windows安装python图文教程
May 18 Python
Python IDE Pycharm中的快捷键列表用法
Aug 08 Python
tensorflow实现打印ckpt模型保存下的变量名称及变量值
Jan 04 Python
pandas数据处理之绘图的实现
Jun 15 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
点评山进PR-D3L三波段收音机
2021/03/02 无线电
PHP执行速率优化技巧小结
2008/03/15 PHP
在PHP中检查PHP文件是否有语法错误的方法
2009/12/23 PHP
PHP页面实现定时跳转的方法
2014/10/31 PHP
PHP编程之设置apache虚拟目录
2016/07/08 PHP
PHP编程获取音频文件时长的方法【基于getid3类】
2017/04/20 PHP
javascript 选择文件夹对话框(web)
2009/07/07 Javascript
jquery中focus()函数实现当对象获得焦点后自动把光标移到内容最后
2013/09/29 Javascript
JavaScript如何实现在文本框(密码框)输入提示语
2015/12/25 Javascript
jquery实现自适应banner焦点图
2017/02/16 Javascript
Angularjs为ng-click事件传递参数
2017/06/15 Javascript
AngularJS中controller控制器继承的使用方法
2017/11/03 Javascript
使用Vue的slot插槽分发父组件内容实现高度复用、更加灵活的组件(推荐)
2018/05/01 Javascript
JavaScript中set与get方法用法示例
2018/08/15 Javascript
在element-ui的el-tree组件中用render函数生成el-button的实例代码
2018/11/05 Javascript
Vant的安装和配合引入Vue.js项目里的方法步骤
2018/12/05 Javascript
vue强制刷新组件的方法示例
2019/02/28 Javascript
超轻量级的js时间库miment使用解析
2019/08/02 Javascript
基于JS实现计算24点算法代码实例解析
2020/07/23 Javascript
Python中subprocess模块用法实例详解
2015/05/20 Python
Django中数据库的数据关系:一对一,一对多,多对多
2018/10/21 Python
Python3获取电脑IP、主机名、Mac地址的方法示例
2019/04/11 Python
python 实现将多条曲线画在一幅图上的方法
2019/07/07 Python
如何在django中添加日志功能
2020/02/06 Python
TensorFlow获取加载模型中的全部张量名称代码
2020/02/11 Python
PyInstaller运行原理及常用操作详解
2020/06/13 Python
python中pathlib模块的基本用法与总结
2020/08/17 Python
利用python查看数组中的所有元素是否相同
2021/01/08 Python
39美元购买一副眼镜或太阳镜:39DollarGlasses.com
2018/06/17 全球购物
Manuka Doctor英国官网:真正的麦卢卡蜂蜜和护肤品
2018/10/26 全球购物
Blue Nile蓝色尼罗河香港官网:世界最大在线钻石珠宝销售商
2020/05/07 全球购物
远程教育心得体会
2014/01/03 职场文书
大学辅导员事迹材料
2014/02/05 职场文书
仓库管理员岗位职责
2014/03/19 职场文书
抽奖活动主持词
2014/03/31 职场文书
保密工作承诺书
2014/08/29 职场文书