网络群聊系统
1、網(wǎng)絡(luò)群聊系統(tǒng)簡(jiǎn)介
簡(jiǎn)單來(lái)說(shuō),這個(gè)聊天系統(tǒng)是參照《Linux高性能服務(wù)器編程》中有個(gè)簡(jiǎn)單的聊天系統(tǒng)實(shí)現(xiàn)的群聊功能。
服務(wù)器端負(fù)責(zé)接收客戶(hù)端的消息,放到數(shù)據(jù)池中,還負(fù)責(zé)從數(shù)據(jù)池中取出數(shù)據(jù)轉(zhuǎn)發(fā)給在線(xiàn)的客戶(hù)端;
每個(gè)客戶(hù)端負(fù)責(zé)發(fā)送和接收數(shù)據(jù),還負(fù)責(zé)數(shù)據(jù)的序列化和反序列化。
2、網(wǎng)絡(luò)群聊系統(tǒng)背景知識(shí)
(1)在Linux操作系統(tǒng)下實(shí)現(xiàn),本人用的是CentOS 6.5
(2)熟悉Linux的開(kāi)發(fā)環(huán)境,使用vim,g++/gcc, gdb,make/makefile, 會(huì)編寫(xiě)Makefile
(3) 熟悉UDP網(wǎng)絡(luò)編程
(4)熟悉C/C++語(yǔ)言,以及STL容器的使用。
(5)熟悉生產(chǎn)者消費(fèi)者模型,(本系統(tǒng)使用的是單消費(fèi)者,單生產(chǎn)者)
(6)熟悉多線(xiàn)程編程,了解信號(hào)量
(7)了解shell編程,
(8)了解開(kāi)源庫(kù)jsoncpp,nucrse/ncursew
3、群聊系統(tǒng)的實(shí)現(xiàn)原理
從上圖可以知道該系統(tǒng)的實(shí)現(xiàn)流程:服務(wù)器端使用生產(chǎn)者消費(fèi)者模型,生產(chǎn)者從網(wǎng)絡(luò)中拿數(shù)據(jù)存到數(shù)據(jù)池中,消費(fèi)者從數(shù)據(jù)池中拿數(shù)據(jù)發(fā)送到網(wǎng)絡(luò)中,從而達(dá)到轉(zhuǎn)發(fā)的目的。
4、群聊系統(tǒng)系統(tǒng)框架
client模塊:暢聊系統(tǒng)client上層邏輯,提供client底層通信
server模塊:暢聊系統(tǒng)server上層邏輯,提供server底層通信
comm模塊:暢聊系統(tǒng)底層公共邏輯,如數(shù)據(jù)序列化。
data_pool模塊:數(shù)據(jù)池的實(shí)現(xiàn)
window模塊:client窗口模塊
lib第三?方庫(kù)模塊:提供第三?方庫(kù)模塊
conf模塊:提供server的配置文件
plug插件起停服務(wù)腳本模塊:起停服務(wù)腳本
5、詳細(xì)模塊介紹
5.1數(shù)據(jù)池
服務(wù)端要維護(hù)一個(gè)數(shù)據(jù)池,從數(shù)據(jù)池中存儲(chǔ)和讀取數(shù)據(jù),數(shù)據(jù)池實(shí)際上是基于生產(chǎn)者消費(fèi)者模型的環(huán)形隊(duì)列。
數(shù)據(jù)池的類(lèi)
5.2 服務(wù)器端
由于服務(wù)器端要轉(zhuǎn)發(fā)數(shù)據(jù)給客戶(hù)端,所以也要維護(hù)一張用戶(hù)列表,本系統(tǒng)用map實(shí)現(xiàn),用戶(hù)ip作為key值,sockaddr_in作為value值。
5.3 客戶(hù)端界面window
客戶(hù)端界面使用ncures 庫(kù),提供基本的窗口界面,有點(diǎn)low…………
window.h 文件
5.5comm模塊
分裝jsoncpp庫(kù),實(shí)現(xiàn)數(shù)據(jù)的序列化和反序列化.
為什么要對(duì)輸入的消息進(jìn)行序列化和反序列化呢?
我們不能直接將客戶(hù)端輸入框輸入的內(nèi)容發(fā)送給服務(wù)器,因?yàn)橛脩?hù)很多的話(huà),最后就無(wú)法辨別消息是哪個(gè)用戶(hù)所發(fā)的了,為此我們給每條消息都加上當(dāng)前用戶(hù)的信息。所以客戶(hù)端給服務(wù)器發(fā)送的消息是由用戶(hù)的信息和從輸入框輸入的消息拼接而成的。
還有就是,如果用戶(hù)退出的話(huà),服務(wù)器要將該用戶(hù)從用戶(hù)列表中移除。為此我們可以在客戶(hù)端給服務(wù)器發(fā)送的消息中再拼接一個(gè)cmd字段,用來(lái)表示客戶(hù)端是否退出。
6客戶(hù)端udp_client
采用多線(xiàn)程的方式,分別管理四個(gè)窗口,分別處理四個(gè)窗口事務(wù)。
結(jié)果演示
項(xiàng)目總結(jié):
(1) 解決群聊系統(tǒng)中識(shí)別消息用戶(hù),編寫(xiě)data類(lèi),實(shí)現(xiàn)序列化與反序列化。
(2)解決客戶(hù)端退出后,界面重置問(wèn)題,使用信號(hào)捕捉函數(shù),捕捉2號(hào)信號(hào),執(zhí)行信號(hào)注冊(cè)函數(shù)。
(3)在項(xiàng)目中引入jsoncpp和ncures庫(kù),在編寫(xiě)makefile 編譯鏈接庫(kù)時(shí),出現(xiàn)錯(cuò)誤,jsoncpp庫(kù)是64位版本,而centos6.5版本是32位版本,出現(xiàn)不兼容,找不到庫(kù)的問(wèn)題。
(4) 編寫(xiě)Makefile,出現(xiàn)庫(kù)路徑找不到情況。
項(xiàng)目源碼
暢聊系統(tǒng)Chat System
總結(jié)
- 上一篇: 西威变频器avo下载调试资料_双色图解变
- 下一篇: 【200个】电子病历系统(EMR)精华资