網路群聊系統

2021-08-04 06:13:50 字數 2451 閱讀 6106

1、網路群聊系統簡介

簡單來說,這個聊天系統是參照《linux高效能伺服器程式設計》中有個簡單的聊天系統實現的群聊功能。

每個客戶端負責傳送和接收資料,還負責資料的序列化和反序列化。

2、網路群聊系統背景知識

(1)在linux作業系統下實現,本人用的是centos 6.5

(2)熟悉linux的開發環境,使用vim,g++/gcc, gdb,make/makefile, 會編寫makefile

(3) 熟悉udp網路程式設計

(4)熟悉c/c++語言,以及stl容器的使用。

(5)熟悉生產者消費者模型,(本系統使用的是單消費者,單生產者)

(6)熟悉多執行緒程式設計,了解訊號量

(7)了解shell程式設計,

(8)了解開源庫jsoncpp,nucrse/ncursew

3、群聊系統的實現原理

從上圖可以知道該系統的實現流程:伺服器端使用生產者消費者模型,生產者從網路中拿資料存到資料池中,消費者從資料池中拿資料傳送到網路中,從而達到**的目的。

4、群聊系統系統框架

client模組:暢聊系統client上層邏輯,提供client底層通訊

server模組:暢聊系統server上層邏輯,提供server底層通訊

comm模組:暢聊系統底層公共邏輯,如資料序列化。

data_pool模組:資料池的實現

window模組:client視窗模組

lib第三⽅方庫模組:提供第三⽅方庫模組

conf模組:提供server的配置檔案

plug外掛程式起停服務指令碼模組:起停服務指令碼

5、詳細模組介紹

5.1資料池

服務端要維護乙個資料池,從資料池中儲存和讀取資料,資料池實際上是基於生產者消費者模型的環形佇列。

資料池的類

5.2 伺服器端

由於伺服器端要**資料給客戶端,所以也要維護一張使用者列表,本系統用map實現,使用者ip作為key值,sockaddr_in作為value值。

5.3 客戶端介面window

客戶端介面使用ncures 庫,提供基本的視窗介面,有點low…………

window.h 檔案

5.5comm模組

分裝jsoncpp庫,實現資料的序列化和反序列化.

為什麼要對輸入的訊息進行序列化和反序列化呢?

我們不能直接將客戶端輸入框輸入的內容傳送給伺服器,因為使用者很多的話,最後就無法辨別訊息是哪個使用者所發的了,為此我們給每條訊息都加上當前使用者的資訊。所以客戶端給伺服器傳送的訊息是由使用者的資訊和從輸入框輸入的訊息拼接而成的。

還有就是,如果使用者退出的話,伺服器要將該使用者從使用者列表中移除。為此我們可以在客戶端給伺服器傳送的訊息中再拼接乙個cmd欄位,用來表示客戶端是否退出。

6客戶端udp_client

採用多執行緒的方式,分別管理四個視窗,分別處理四個視窗事務。

結果演示

專案總結:

(1) 解決群聊系統中識別訊息使用者,編寫data類,實現序列化與反序列化。

(2)解決客戶端退出後,介面重置問題,使用訊號捕捉函式,捕捉2號訊號,執行訊號註冊函式。

(3)在專案中引入jsoncpp和ncures庫,在編寫makefile 編譯鏈結庫時,出現錯誤,jsoncpp庫是64位版本,而centos6.5版本是32位版本,出現不相容,找不到庫的問題。

(4) 編寫makefile,出現庫路徑找不到情況。

專案原始碼

暢聊系統chat system

網路群聊系統

一 編寫視窗類window,用ncurses庫.window介面 1.create newwin int,int,int,int 建立新視窗並加邊框 2.create output 建立輸出聊天內容的視窗 3.create input 建立輸入視窗 4.create header 建立標題視窗,顯示...

網路程式設計之群聊

群聊客戶端 importsocket,threading 建立個服務端 server socket.socket socket.af inet,socket.sock stream 繫結伺服器的ip和埠 server.bind 192.168.0.1 8000 設定最大掛起連線數5 server.l...

QT學習 基於TCP IP的簡易群聊系統

查閱一些資料,我自己試著寫了乙個簡單的聊天系統。一 建立套接字進行監聽 建立套接字 socket server new qtcpserver this 監聽,埠號 9999 bind listen bool isok server listen qhostaddress any,9999 監聽失敗 ...