一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術(shù)及教程分享平臺(tái)!
分類導(dǎo)航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務(wù)器之家 - 腳本之家 - Python - 使用Python的Tornado框架實(shí)現(xiàn)一個(gè)一對(duì)一聊天的程序

使用Python的Tornado框架實(shí)現(xiàn)一個(gè)一對(duì)一聊天的程序

2020-06-12 10:36CHENGKANG Python

這篇文章主要介紹了使用Python的Tornado框架實(shí)現(xiàn)一個(gè)一對(duì)一聊天的程序,程序基于WebSocket,需要的朋友可以參考下

按思路來聊:

類似微信,點(diǎn)擊用戶可以進(jìn)入一對(duì)一聊天頁面;另有聊天框列表包含所有存在聊天記錄的一對(duì)一聊天框,點(diǎn)擊進(jìn)入聊天頁面。
【數(shù)據(jù)結(jié)構(gòu)】

因?yàn)殡p方都有聊天記錄,所以每一個(gè)聊天實(shí)際上得儲(chǔ)存兩份,設(shè)計(jì)的數(shù)據(jù)結(jié)構(gòu)如下:

A :

?
1
user_a = {“id”:1,”name”:”A”}

B :

?
1
user_b = {“id”:2,”name”:”B”}

A的聊天記錄:

?
1
chat_a = { “id”:1, “user”:1, “who”:2, “name”:”B”, “new”:0, msg:[]}

B的聊天記錄:

?
1
chat_b = { “id”:2, “user”:2, “who”:1, “name”:”A”, “new”:0, msg:[]}

msg實(shí)際上是個(gè)list,結(jié)構(gòu)如下:msg = { “user”:發(fā)送者id, “name”:發(fā)送者name, “date”:發(fā)送時(shí)間, “content”:消息內(nèi)容 }
【業(yè)務(wù)邏輯】

當(dāng)A點(diǎn)擊好友列表中B的名字–>進(jìn)入聊天框(根據(jù)雙方id通過字段user、who找到對(duì)應(yīng)chat_a,chat = coll.find_one({“user”:user_a[‘id'], “who”:user_b[‘id']});如果該chat不存在,則利用雙方id創(chuàng)建chat_a)

發(fā)送消息(更新chat_a和chat_b,如果chat_b不存在則創(chuàng)建chat_b;如果chat_b不在線則更新chat_b[‘new'] = 1)

A刪除聊天框(刪除chat_a)
【記錄客戶端連接】

由于是多個(gè)一對(duì)一聊天,所以不能直接用教程里的set來記錄連接。

最后的決定是用一個(gè) dict,用雙方用戶id拼接的字符串作為key,用list存客戶端連接。

...SocketHandler(...):

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
chats = dict()
...
def on_open(self):
  ...
  #通過雙方id來生成一個(gè)獨(dú)一無二的字符串
  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'])
  #判斷當(dāng)前會(huì)話是否存在,存在則添加當(dāng)前用戶
  if key in chats:
    SocketHandler.chats[key].append(self)
  #不存在則創(chuàng)建會(huì)話,并將當(dāng)前用戶添加進(jìn)去
  else
    SocketHandler.chats[key] = [self]

【發(fā)送消息】

從客戶端調(diào)用send函數(shù),在服務(wù)端on_message函數(shù)中接受參數(shù)后更新雙方聊天記錄。之后調(diào)用send_to_all(key, message)來更新聊天窗口。
【發(fā)通知/更新聊天窗口】

更新數(shù)據(jù)庫(kù)里的聊天記錄后還要在聊天窗口更新html,所以需要通知該會(huì)話的連接者。

根據(jù)我們記錄連接者的方式,對(duì)應(yīng)的通知函數(shù)如下:

?
1
2
3
def send_to_all(key,message):
  for user in SocketHandler.chats[key]:
    user.write_message(json.dumps(message))

【關(guān)閉連接】

根據(jù)我們記錄連接者的方式,對(duì)應(yīng)的關(guān)閉函數(shù)如下:

?
1
2
3
4
5
6
7
def on_close(self):
  ...
  #用on_open函數(shù)中的方法構(gòu)造key
  if key in SocketHandler.chats:
    SocketHandler.chats[key].remove(self)#刪除當(dāng)前連接
    if len(SocketHandler.chats[key]) == 0:
      del SocketHandler.chats[key]#當(dāng)會(huì)話無連接者則刪除會(huì)話

經(jīng)過上面的改造,就實(shí)現(xiàn)多個(gè)一對(duì)一聊天功能

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: av中文字幕网免费观看 | 91视频无限看| 国产91精品露脸国语对白 | 欧美日韩精彩视频 | 恩爱夫妇交换小说 | 3344在线看片 | 91制片厂制作果冻传媒破解 | 欧美日韩一区二区中文字幕视频 | 久久精品久久久 | 香蕉视频在线观看网站 | 成人男女啪啪免费观看网站 | 天天干天天操天天爽 | 男人影院在线观看 | 国产情侣视频观看 | haodiaocao几万部精彩视频 | 深夜福利免费观看 | 国产成人综合网亚洲欧美在线 | 成年女人毛片免费观看中文w | 欧美不卡一区二区三区免 | 亚洲久草视频 | 好奇害死猫在线观看 | 17岁韩国在线观看免费1 | 2020年最新国产精品视频免费 | 日韩精品久久不卡中文字幕 | 香蕉eeww99国产精选播放 | 我要色色网| 亚洲女同在线观看 | 好姑娘完整版在线观看中文 | 色噜噜 男人的天堂在线观看 | 3d动漫美女被吸乳羞羞视频 | 国内精品久久久久久不卡影院 | 成人网欧美亚洲影视图片 | 国产一区日韩二区欧美三 | 亚洲视频在线一区二区三区 | 久久综合狠狠综合狠狠 | 国产精品视频人人做人人爱 | 猛男深夜狂cao小男生 | 成年男女免费视频网站 | 地址二地址三2021变更 | 国产免费丝袜调教视频 | 国产美女亚洲精品久久久综合 |