KonsanNet 網絡通信框架實現(第四章)— 庫封裝、分層、容器、內存池(第一階段結束)

框架源碼地址

       GitHub:https://github.com/KonsanAlide/KonsanNet

修改內容闡述

        這兩天有些時間,修改了部分代碼,爲四部分:服務端庫封裝、消息包處理的分層、隊列容器、內存池。

服務端庫封裝、消息包處理的分層

       爲了以後使用方便,把服務端的會話驗證消息處理功能、用戶消息處理、數據包壓縮和加密處理這三部分抽到外層來,關於數據包的包頭、組包、加密、壓縮、校驗等過程的數據處理都放到更內層的類來實現,服務端放在在CXConnectionObject裏面進行處理,客戶端放在CXTcpClient類裏面處理。

     本次版本0.5把服務端封裝成一個庫,然後實現了一個服務端的測試Demo: CXCommunicationServerTest。在CXCommunicationServerTest裏面實現自定義的會話消息處理類CXSessionLevelBase的派生類CXAdvancedSessionMessageProcessHandle,自定義的用戶消息處理類CXUserMessageProcessBase的派生類CXFileMessageProcessHandle,和自定義的數據包加解密、壓縮解壓類CXDataParserImpl的派生類CXFastDataParserHandle。當然會話消息處理可以使用默認的,不用真的實現,數據處理類CXDataParserImpl也可以不用實現,就是不壓縮數據也不加密數據。但是用戶消息總的自己定義吧,大家用的時候在繼承CXUserMessageProcessBase類,在自定的派生類裏面實現自己的消息包處理就行。

        爲了大家使用起來更簡單,我把數據包的處理過程分層隔離,在最底層的CXConnectionObject類和CXTcpClient裏面對數據包進行頭部數據填充、校驗、執行數據加解密和壓縮解壓縮。發送數據時,在上層的類裏面把用戶消息數據Buffer和長度給到底層的發送接口即可。接收數據時CXUserMessageProcessBase裏面接收到的就是已經解壓解密後的用戶消息,不包含包頭部分,這樣簡單明瞭。

內存池

      爲了內存池更方便使用,我在CXMemoryCacheManager類裏面實現了更簡便的內存分配和釋放的接口,不再需要用戶直接使用CXMemoryCache對象來操作內存塊,而且未來可以在CXMemoryCacheManager類統一實現內存池的負載均衡管理。

    CXMemoryCacheManager裏面我爲了加快分配內存塊的速度,用一個數組取代了原來的hashmap來保存CXMemoryCache對象指針數組,數組裏面保存256* 2^n 字節大小的塊的 CXMemoryCache對象指針數組的指針,目前內存池裏面的數據塊最大支持1MB,所以n最大是13。

 

 

隊列容器

       最近在測試高併發的過程中,發現在消息隊列CXMessageQueue裏面,原來爲了省事所用的std::queue耗費的CPU時長不大理想,所以我用類似內存池的方式實現了一個CXQueue的類,來替換std::queue的功能,簡單測試下來,CXQueue的10萬次push和pop操作的性能是std::queue的4倍左右。不過這個類,還需要修改,目前是使用的內存不停增長的,不進行任何的釋放,下來應該加入當低耗時釋放內存塊的處理。

 

總結

       到目前爲止,該套通信框架(庫),TCP協議下的處理基本完成,下來我會補充下尚未弄完的部分,比如客戶端庫的封裝,內存池的管理優化,一些性能調優,差不多基本就這樣了。

       日誌部分,我暫時沒有太多的去處理,大家用的時候多加一些吧,我後面也會抽時間補充一些。

       這一階段基本到此結束

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章