基于MQTT的python聊天室
1、內(nèi)容
本實驗做的是基于MQTT的聊天室,主要特點有:
? ? 1. 部署方面,Server端代碼運行于我一個云服務(wù)器端,我在本地只要啟動Client端的服務(wù)即可連接上服務(wù);
? ? 2. 用戶操作方面,用戶可以進行的操作有:登錄、注冊、選擇聊天室、聊天、獲取該聊天室以往所有內(nèi)容;
? ? 3. 數(shù)據(jù)通信方面,所有通信都是基于MQTT的發(fā)布-訂閱機制。單個Client和Server通信時,登錄、注冊和獲取聊天室所有內(nèi)容Server以特定的topic進行發(fā)布,比如說登錄就用“l(fā)ogin”,Server端根據(jù)主題不同處理不同客戶端的操作,以各自客戶端的唯一標識為主題發(fā)布消息,確保準確的客戶端收到信息;,而Server發(fā)布某一個聊天室某一條最新消息時,使用的topic是聊天室的名字;用戶登錄成功后會獲得Server端發(fā)布的一個token,接下來請求信息時使用token通信;
? ? 4. 也因為采用了token,對用戶進行嚴格的區(qū)分,同一賬號在同一時間只能在一個Client端登錄,即本地若開了兩個Client登錄同個賬號,也會只有晚登錄的Client有效。
? ? 5. 代碼較多,已上傳到github,鏈接為Trident-Chat,具體部署細節(jié)發(fā)布在上面
?
2、實驗平臺、工具、框架
使用pycharm開發(fā),語言為python,數(shù)據(jù)庫使用mysql和redis,代理服務(wù)器使用mosquitto,遵循MVC模式,具體框架有:
? ? 1. 數(shù)據(jù)庫操作,使用基于pymysql的ORM:peewee;
? ? 2. 界面開發(fā),使用tkinter和easygui;
? ? 3. 通信遵循MQTT協(xié)議,代碼中使用paho-mqtt搭建客戶端
?
3、實驗設(shè)計
UML活動圖如下:
?
數(shù)據(jù)流圖如下:
?
4、實驗步驟
? ? 1. Server類和Client類均有的線程鎖的設(shè)計,該設(shè)計是為了保證同一時間一個Client或者Server對象只能有一個維持MQTT監(jiān)聽的線程,以防止多個線程同時調(diào)用函數(shù)造成死鎖以及數(shù)據(jù)冗余。
? ? 2. Server類和Client類均有個字段和執(zhí)行函數(shù)的映射,該設(shè)計增強了代碼的可讀性,便于管理,具體實現(xiàn)是根據(jù)字段不同選擇不同的操作函數(shù),該字段是從接收的信息而來。
? ? 3. Client類的operate函數(shù)接收一個命令,根據(jù)命令執(zhí)行函數(shù),并設(shè)置線程控制的變量。
? ? 4. 接上文,舉個例子,當用戶登錄時,便會執(zhí)行Client對象的函數(shù),,發(fā)送用戶名、密碼到Server端,并監(jiān)聽Server端發(fā)送的關(guān)于這個用戶的登錄消息,收到,即提示主線程進行信息展示或頁面跳轉(zhuǎn)的操作,這個提示功能由threading.Event對象的set函數(shù)來執(zhí)行。界面類的對象在監(jiān)聽服務(wù)端對于登錄操作的返回信息時,是另開子線程進行訂閱,不阻塞主線程,增強用戶體驗
? ? 首先是界面類對象判斷輸入框內(nèi)輸入是否正確,之后另開線程調(diào)用Client對象operate函數(shù)
?
? ? Client對象的operate函數(shù)選擇了send_login_msg函數(shù)發(fā)送數(shù)據(jù)
?
? ? Client對象一直處于訂閱狀態(tài),收到關(guān)于登錄的返回信息便執(zhí)行一系列操作,set函數(shù)通知主線程
?
5、運行截圖
? ? 1. 初始界面
? ? 2. 注冊、登錄(若是失敗會有提示信息)
?
?
? ? 3. 進入聊天室,選擇一個聊天室,就會更新以往的內(nèi)容
? ? 4. 多個用戶進行聊天,不同聊天室不互通
? ? 5. 用戶可以注銷退出,注銷則回到登錄界面
?
?
?
總結(jié)
以上是生活随笔為你收集整理的基于MQTT的python聊天室的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 菜鸟学习:有些同学VMware linu
- 下一篇: python程序设计基础刘艳网课_智慧职