网络群聊系统
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
總結
- 上一篇: 西威变频器avo下载调试资料_双色图解变
- 下一篇: 【200个】电子病历系统(EMR)精华资