源碼地址
GitHub:https://github.com/KonsanAlide/CXCommunicationFramework
章前闡述
這一章主要講的是整個框架的設計思路,其實主要是服務器端部分,這一部分在博客上有很多人講過,思路上大都相似,只是細節上有所不同,雖然這細節偏偏是決定了性能的關鍵性,不過本章不深入分析這些細節,只闡述架構,原因如下:
一、因爲這Version0.2只是居於經驗,僅把架構設計、線程模型、模塊層次、邏輯流程、基本的消息通信這幾塊走通,實現初步穩健的架構、準確的數據傳輸、會話管理、錯誤處理,性能方面暫時未經過大量調整和測試,後期會有這方面的內容;
二、這個框架初步來講,僅是一個通用性框架,實現的時間有限,能力有限。一般來講,能滿足普通的單服務器節點的大規模數據傳輸,這是一個Open的架構,如果對性能或者效率上有很多要求,大家也需要在自己的業務環境中進行一定的調整,相信這一點對大都有幾年的網絡通信開發經驗的通信來講,都不困難,需要的是大量的測試和細微的調整。通過本框架代碼,提供給大家一些基礎的架構模塊,希望能給大家帶來一些方便:當需搭建這樣一套系統的時候,無需再花費大量時間從頭實現,僅需要進行一定的調整和業務邏輯部分的編碼實現即可。
三、網絡通信的細節問題,在論壇和博客上有很多人反覆的討論解決過,我並不見得比他們更優秀。
架構設計說明
下面我們接上昨天前文,來說明下這個框架的設計架構。
服務端(CXCommunicationServer):目前兼容Windows和Linux兩個平臺,Windows使用IOCP,linux使用epoll,大約分了四層(時間精力都有限的情況下,這裏面的層次劃分其實並不非常明顯):內核IO通信層、數據包解析層、會話管理層、用戶消息處理層。
客戶端(CXCommunicationClient):目前兼容Windows和Linux兩個平臺,包含基礎的SOCKET封裝類,包含消息通信類,文件傳輸客戶端類,多線程測試函數。下來要增加會話管理類。未來如時間允許,P2P實現、UDP實現也會逐漸加入到裏面來。
內存管理模塊(CXMemoryCache):目前初步實現一個簡單的內存鏈表(slab)來做一個內存池對象,實現一個內存池對象管理類。
其它模塊:其它模塊皆爲輔助功能,不單獨講,在後文闡述的過程中會涉及一些。
服務端(CXCommunicationServer)架構設計
內核IO通信層
備註:CXCommunicationServer類是服務端的管理類,協調啓動各大模塊並進行中間處理。
數據包解析層
數據包解析層,包含兩個工作:數據包解包(排序、加解密、解壓),數據包分發。
CXCommunicationServer類接收內核IO層CXSocketServerKernel拋出來的事件,把Receive事件拋給CXConnectionObject來處理。
CXConnectionObject類是連接封裝對象,處理收發包、排序、組包拆包、加解密、加解壓等數據處理邏輯的,當然這塊的功能也可以抽到一層獨立的數據處理層來弄,開始設計時我是如此考慮的,但開發中時間一趕,就全塞到這類裏面來了,而且數據校驗、加解密、加解壓還沒實現。
數據分發模塊,CXDataDispathLevelImpl、CXMessageQueue、CXMessageProcessLevelBase是屬於這一部分的,CXConnectionObject把拆解出來消息包通過直接放入CXDataDispathLevelImpl中CXMessageQueue對象中,CXDataDispathLevelImpl有多個CXMessageQueue對象,CXMessageProcessLevelBase是線程對象,有多個,CXMessageProcessLevelBase從CXMessageQueue中不停的獲取消息包並拋到會話層和用戶消息處理層來處理。
會話管理層
用戶消息處理層
客戶端(CXCommunicationClient)
最後
突然想起來,可能有些同學想要知道下該代碼如何編譯,很簡單:
把代碼下載下來後,在CXCommunicationServer等文件夾所在的目錄下建一個build文件夾,命令行中cd到這個build文件夾裏面,用“cmake .. ”即可構建好工程,Windows和Linux皆同。