使用Python的Tornado框架实现一个一对一聊天的程序
按思路来聊: 类似微信,点击用户可以进入一对一聊天页面;另有聊天框列表包含所有存在聊天记录的一对一聊天框,点击进入聊天页面。 因为双方都有聊天记录,所以每一个聊天实际上得储存两份,设计的数据结构如下: 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”,msg:[]} msg实际上是个list,结构如下:msg = { “user”:发送者id,“name”:发送者name,“date”:发送时间,“content”:消息内容 } 当A点击好友列表中B的名字C>进入聊天框(根据双方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]#当会话无连接者则删除会话 经过上面的改造,就实现多个一对一聊天功能 您可能感兴趣的文章:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 使用Django包创建一个facebook通知facepy:[15](#15)必须使
- Python简单计算数组元素平均值的方法示例
- Python:添加布尔Numpy数组
- python – 在文件中查找最小浮点数然后在其上方打印并排列
- python – unittest无法发现/运行测试
- python – 强制转换为Unicode:需要字符串或缓冲区,找到int
- 反爬虫的必要措施!get到了就在也不担心反爬了!
- PyCharm出现TabError: inconsistent use of tabs and space
- python – 循环遍历列中的多个值
- python – django rest framework 3 ImageField发送ajax结果