使用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处理文本文件实现生成指定格式文件的方法
Jul 31 Python
简单上手Python中装饰器的使用
Jul 12 Python
Python应用03 使用PyQT制作视频播放器实例
Dec 07 Python
python中 chr unichr ord函数的实例详解
Aug 06 Python
Python selenium实现微博自动登录的示例代码
May 16 Python
使用pandas模块读取csv文件和excel表格,并用matplotlib画图的方法
Jun 22 Python
Windows下安装Scrapy
Oct 17 Python
python实现名片管理系统
Nov 29 Python
python实现任意位置文件分割的实例
Dec 14 Python
Python爬虫实现验证码登录代码实例
May 10 Python
tensorflow查看ckpt各节点名称实例
Jan 21 Python
Python-jenkins模块获取jobs的执行状态操作
May 12 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
全国FM电台频率大全 - 7 吉林省
2020/03/11 无线电
php中通过smtp发邮件的类,测试通过
2007/01/22 PHP
PHP 读取Postgresql中的数组
2013/04/14 PHP
PHP生成指定随机字符串的简单实现方法
2015/04/01 PHP
php实现SAE上使用storage上传与下载文件的方法
2015/06/29 PHP
理解PHP中的Session及对Session有效期的控制
2016/01/08 PHP
PHP实现求解最长公共子串问题的方法
2017/11/17 PHP
Prototype1.5 rc2版指南最后一篇之Position
2007/01/10 Javascript
JavaScript函数、方法、对象代码
2008/10/29 Javascript
Jquery绑定事件(bind和live的区别介绍)
2013/08/23 Javascript
jquery 日期控件datepicker属性详细解析
2013/11/08 Javascript
8个实用的jQuery技巧
2014/03/04 Javascript
IE8中动态创建script标签onload无效的解决方法
2014/12/22 Javascript
angularjs基础教程
2014/12/25 Javascript
JavaScript操作DOM元素的childNodes和children区别
2015/04/01 Javascript
JS实现的仿淘宝交易倒计时效果
2015/11/27 Javascript
Jquery修改image的src属性,图片不加载问题的解决方法
2016/05/17 Javascript
node.js中的事件处理机制详解
2016/11/26 Javascript
Jquery循环截取字符串的方法(多出的字符串处理成"...")
2016/11/28 Javascript
使用Xcache缓存器加速PHP网站的配置方法
2017/04/22 Javascript
JS如何实现在页面上快速定位(锚点跳转问题)
2017/08/14 Javascript
node.js学习之断言assert的使用示例
2017/09/28 Javascript
[01:09:24]Ti4开幕式
2014/07/19 DOTA
Python 正则表达式匹配字符串中的http链接方法
2018/12/25 Python
解决python Markdown模块乱码的问题
2019/02/14 Python
Python实现微信小程序支付功能
2019/07/25 Python
python根据字典的键来删除元素的方法
2020/08/16 Python
HTML5在手机端实现视频全屏展示方法
2020/11/23 HTML / CSS
Eyeko美国:屡获殊荣的睫毛膏、眼线笔和眉妆
2018/07/05 全球购物
Boom手表官网:瑞典手表品牌,设计你的手表
2019/03/11 全球购物
英国领先的在线高尔夫商店:Gamola Golf
2019/11/16 全球购物
高级文秘工作总结的自我评价
2013/09/28 职场文书
社区国庆节活动方案
2014/02/05 职场文书
小班上学期幼儿评语
2014/12/30 职场文书
党风廉正建设个人工作总结
2015/03/06 职场文书
nginx简单配置多个server的方法
2021/03/31 Servers