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