使用Python的Tornado架構實現一個一對一聊天的程式

來源:互聯網
上載者:User
按思路來聊:

類似,點擊使用者可以進入一對一聊天頁面;另有聊天框列表包含所有存在聊天記錄的一對一聊天框,點擊進入聊天頁面。
【資料結構】

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

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]#當會話無串連者則刪除會話

經過上面的改造,就實現多個一對一聊天功能

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.