使用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查找相似单词的方法
Mar 05 Python
简介Python设计模式中的代理模式与模板方法模式编程
Feb 02 Python
浅谈Python类里的__init__方法函数,Python类的构造函数
Dec 10 Python
Python实现Pig Latin小游戏实例代码
Feb 02 Python
python2.7+selenium2实现淘宝滑块自动认证功能
Feb 24 Python
python打包压缩、读取指定目录下的指定类型文件
Apr 12 Python
Python检测数据类型的方法总结
May 20 Python
如何利用Anaconda配置简单的Python环境
Jun 24 Python
基于python实现自动化办公学习笔记(CSV、word、Excel、PPT)
Aug 06 Python
python生成特定分布数的实例
Dec 05 Python
判断Python中的Nonetype类型
May 25 Python
python实现商品进销存管理系统
May 30 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获取中文拼音首字母类和函数分享
2014/04/24 PHP
CodeIgniter框架过滤HTML危险代码
2014/06/12 PHP
PHP实现递归无限级分类
2015/10/22 PHP
浅析PHP数据导出知识点
2018/02/17 PHP
Laravel相关的一些故障解决
2020/08/19 PHP
PHPstorm激活码2020年5月13日亲测有效
2020/09/17 PHP
JavaScript使用prototype定义对象类型
2007/02/07 Javascript
jQuery性能优化28条建议你值得借鉴
2013/02/16 Javascript
JavaScript获取客户端IP的方法(新方法)
2016/03/11 Javascript
js设置和获取自定义属性的方法
2016/10/20 Javascript
Jquery Easyui自定义下拉框组件使用详解(21)
2020/12/31 Javascript
浅谈javascript中的事件冒泡和事件捕获
2016/12/28 Javascript
详解ES6之async+await 同步/异步方案
2017/09/19 Javascript
JS跳转手机站url的若干注意事项
2017/10/18 Javascript
webpack4.x下babel的安装、配置及使用详解
2019/03/07 Javascript
新手快速入门微信小程序组件库 iView Weapp
2019/06/24 Javascript
JavaScript 实现继承的几种方式
2021/02/19 Javascript
跟老齐学Python之网站的结构
2014/10/24 Python
仅用500行Python代码实现一个英文解析器的教程
2015/04/02 Python
python使用wxPython打开并播放wav文件的方法
2015/04/24 Python
Python中死锁的形成示例及死锁情况的防止
2016/06/14 Python
python实现聊天小程序
2018/03/13 Python
python 提取key 为中文的json 串方法
2018/12/31 Python
Python标准库itertools的使用方法
2020/01/17 Python
安装并免费使用Pycharm专业版(学生/教师)
2020/09/24 Python
HTML5的Geolocation地理位置定位API使用教程
2016/05/12 HTML / CSS
经济学人订阅:The Economist
2018/07/19 全球购物
意大利辅助药品、药物和补品在线销售:FarmaEurope
2020/04/29 全球购物
给公司的建议书范文
2014/05/13 职场文书
党的群众路线教育实践活动学习计划
2014/11/03 职场文书
民政局标准版离婚协议书
2014/12/01 职场文书
2014年信访维稳工作总结
2014/12/08 职场文书
新闻稿怎么写
2015/07/18 职场文书
MySQL 百万级数据的4种查询优化方式
2021/06/07 MySQL
关于Python OS模块常用文件/目录函数详解
2021/07/01 Python
分享几种python 变量合并方法
2022/03/20 Python