本文承接上篇文章的客戶端—伺服器聊天對話程序,進一步設計開發了微信群聊的python模擬程序,涉及的python知識點為:Python實戰:聊天軟體開發與TCP/Socket編程知識匯總(附代碼)和 進程與線程編程!
本文的內容章節為:
群聊對話演示與設計結構進程與線程詳解與代碼演示Python群聊程序代碼詳解
一、群聊對話演示與設計結構
直接來看已經完成的python群聊程序對話演示結果圖:
該python群聊對話功能為:
小明,小蘭,小玲,小紅都是群成員每位群成員向群內發送信息,其他成員都能收到每啟動一個客戶端程序,用戶即可進入群聊 (一個窗口代表一個成員)下面用一張圖簡述群聊功能:
群聊中的成員向群內發送消息是單獨發送給群聊伺服器的,不是直接發送到群聊的群聊伺服器收到成員發送的消息後將該消息向群內轉發,實現群聊
下圖是本文中python群聊程序的設計結構圖(即運行方式),供大家參考:
二、進程與線程詳解及代碼演示
在介紹具體代碼之前,先來為大家詳細總結下作業系統中進程與線程的相關知識以及python演示代碼!
★進程:作業系統中運行的每個程序可視為一個進程,可獨立運行,是作業系統分配資源的基本單位,如QQ程序。
★線程:輕量級的進程,是進程的組成部分,是作業系統執行功能的基本單元,如QQ中的每個聊天窗口。
★進程與線程的區別與聯繫:
一個進程可包含多個線程,一個線程只能屬於一個進程同一個進程中的各線程之間共享其進程下的資源多個進程可以並發啟動,同一個進程中的多個線程也可並發啟動同一進程下的一個線程被銷毀不會影響其他線程進程結束時,其所有線程將也被銷毀★ 現實中的進程與線程:
計算機的CPU承擔了作業系統所有程序的計算工作,好比一座大型工廠。該工廠的電力有限,每次只能供給一個車間的工作,即一個車間開工時,其他車間無法開工,好比CPU在任一時刻都只能有一個任務在運行,而車間就好比進程,表示工廠(CPU)的資源分配基本單元。
一個車間(進程)中可以擁有多位員工,員工就好比線程(一個進程可包含多個線程),一個車間中的所有資源是員工間共享的(線程共享父進程下的資源)。
但某個資源被一個員工佔用時其他員工將無法使用,必須等待當前員工使用完畢才能獲取該資源,如一個員工進入洗手間會鎖上門,那麼其他員工必須等待其方便結束才能使用該洗手間,這把鎖可視為線程間的資源「互斥鎖」,避免多個線程同時訪問同一資源引發衝突。
還有一個「信號量」的介紹,限於篇幅,本文不做贅述,感興趣的讀者可自行搜索:進程線程圖解!
★Python代碼演示進程與線程:
示例代碼:
進程創建線程是通過threading模塊Thread類來實現的,即threading.Thread類,其參數詳解如下:
__init__(self, group=None, target=None, name=None, args=(), kwargs=None, *,daemon=None)
group:線程所屬的線程組,該參數尚未實現,使用默認值Nonetarget:線程要綁定的功能函數args :元組形式,元素的順序與類型必須與target綁定函數的參數一致,即元組的第一個元素傳給target函數的第一個參數,第二個元素傳給target函數的第二個參數……kwargs:字典形式,以key為target指定的函數傳入參數daemon:確定所創線程是否為後代線程三、Python群聊程序代碼詳解
下面的代碼需要以上篇文章:以上篇文章-Python實戰:聊天軟體開發與TCP/Socket編程知識匯總(附代碼)為基礎,便於深刻理解!
★群聊伺服器代碼:
解析:
群聊伺服器沒有限制請求連接的用戶個數(listen())每個請求連接的用戶socket都將被群聊伺服器添加到列表:socket_clientlist群聊伺服器由線程不斷讀取已連接用戶的輸入信息並進行廣播伺服器收到群成員發送的消息後,向socket_clientlist中保存的所有用戶socket,也就是所有群成員群發這條消息,就完成了一個成員把消息發送到群聊的功能,模擬了群聊★ 群聊客戶端代碼:
解析:
主進程不斷接收用戶輸入信息並進行發送子線程不斷接收群聊伺服器廣播的信息
四、Python群聊程序代碼獲取
感興趣的讀者可以評論區留言獲取文中代碼以供學習!文中如有任何不妥之處,還請讀者於評論區交流意見,在此提前感謝!