国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

使用Python的Tornado框架實現一個一對一聊天的程序

2020-02-23 00:51:28
字體:
來源:轉載
供稿:網友

按思路來聊:

類似微信,點擊用戶可以進入一對一聊天頁面;另有聊天框列表包含所有存在聊天記錄的一對一聊天框,點擊進入聊天頁面。
【數據結構】

因為雙方都有聊天記錄,所以每一個聊天實際上得儲存兩份,設計的數據結構如下:

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]#當會話無連接者則刪除會話            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 集安市| 登封市| 英吉沙县| 五寨县| 河北省| 新疆| 梨树县| 兰州市| 银川市| 宝鸡市| 克拉玛依市| 淄博市| 潼关县| 织金县| 吉林市| 绥滨县| 四子王旗| 黔东| 阜宁县| 丹巴县| 保德县| 建德市| 嵊泗县| 凤阳县| 陆川县| 德令哈市| 巴彦淖尔市| 福清市| 枣强县| 青岛市| 石楼县| 广丰县| 怀远县| 三穗县| 阿鲁科尔沁旗| 浙江省| 阳东县| 寻乌县| 泰宁县| 静安区| 北宁市|