中文內容參考自優秀的國產高性能TCP/UDP/HTTP開源網絡通信框架——HP-Socket-HP-Socket通信 (hpsocket.net)
Gethub:GitHub - ldcsaa/HP-Socket: High Performance TCP/UDP/HTTP Communication Component
軟件文檔:HP-Socket Development Guide (v5.8.5-20210909) - 豆丁網 (docin.com)
官方網址:HP-Socket首頁、文檔和下載 - 高性能網絡通信框架 - OSCHINA - 中文開源技術交流社區
介紹
HP-Socket是一套通用的高性能TCP/UDP/HTTP通信框架,包含服務的組件,客戶端組件和Agent組件,廣泛適用於各種不同應用場景的TCP/UDP/HTTP通信系統。它的唯一職責就是接收和發送字節流,不參與應用程序協議的解析工作;與應用程序通過接口進行交互,完全解耦。
1:工作流程
創建偵聽器對象
創建組件對象(並與偵聽器對象綁定)
啟動組件對象
連接到dest主機(僅適用於Agent Component)
處理網絡事件(OnConnect / OnReceive / OnClose等)
停止組件對象(可選:組件對象將在步驟7中的銷毀之前停止)
銷毀組件對象
銷毀偵聽器對象
2:組件分類
HP-Socket包含31個組件,可根據通信角色(Client/Server)、通信協議(TCP/UDP/HTTP)和接收模型(PUSH/PULL/PACK)進行歸類。
-----------------------------------------------------------------------------------------------------------------------------
Server組件:基於IOCP/EPOLL通信模型,並結合緩存池、私有堆等技術實現高效內存管理,支持超大規模、高並發通信場景。
1.服務端應用程序調用Start()方法啟動Server組件,如果調用成功則返回TRUE並收到OnPrepareListen事件。
2.客戶端應用程序向服務端應用程序發起請求時,服務端應用程序將收到OnAccept和OnHandshake事件。
3.客戶端應用程序向服務端應用程序發送數據時,服務端應用程序將收到OnReceive事件。
4.服務端應用程序調用Send()方法向客戶端應用程序發出數據后,服務端應用程序將收到OnSend事件。
5.斷開連接時,服務端應用程序將收到OnClose事件。
6.服務端應用程序調用Stop()方法關閉Server組件,如果調用成功則返回TRUE並收到OnShutdown事件。
--------------------------------------------------------------------------------------------------------------
Agent組件:Agent組件實質上是Multi-Client組件,與Server組件采用相同的技術架構。一個Agent組件對象可同時建立和高效處理大規模Socket連接。
1.客戶端應用程序調用Start()方法啟動Agent組件,如果調用成功則返回TRUE。
2.客戶端應用程序調用Connect()方法向服務端應用程序發起連接請求,如果連接成功則返回TRUE並且會先后收到OnPrepareConnect、OnConnect和OnHandshake事件。
3.客戶端應用程序調用Send()方法向服務端應用程序發出數據后,客戶端應用程序將收到OnSend事件。
4.服務端應用程序向客戶端應用程序發送數據時,客戶端應用程序將收到OnReceive事件
5.斷開連接時,客戶端應用程序將收到OnClose事件。
6.客戶端應用程序調用Stop方法關閉Agent組件,如果調用成功則返回TRUE並收到OnShutdown事件。
-----------------------------------------------------------------------------------------------------------------------------
Client組件:基於Event Select/POLL通信模型,每個組件對象創建一個通信線程並管理一個Socket連接,適用於小規模客戶端場景。
1.客戶端應用程序調用Start()方法向服務端應用程序發起連接請求,如果連接成功則返回TRUE並會先后收到OnprepareConnect、OnConnect和OnHandshake事件。
2.客戶端應用程序調用Send()方法向服務器應用程序發出數據后,客戶端應用程序將收到OnSend事件。
3.服務端應用程序向客戶端應用程序發送數據時,客戶端應用程序將收到OnReceive事件。
4.斷開連接時,客戶端應用程序將收到OnClose事件。
5.客戶端應用程序調用Stop()方法關閉Client組件,如果調用成功則返回TRUE並收到OnClose事件。
3:框架詳述
3.1 接收模型
PUSH模型:組件接收到數據時會觸發監聽器對象的OnReceive事件,把數據“推”給應用程序,應用程序需要立即處理接收到的數據。
PULL模型:組件接收到數據時會觸發監聽器對象的OnReceive事件,告訴應用程序當前已經接收到多少數據,應用程序檢查數據的長度,如果滿足需要則調用組件的Fetch方法把需要的數據“拉”出來。
PULL模型適用於完全清楚應用層協議,並且應用層協議可以根據當前數據包得知下一個數據包長度的場景:Head+Body,它可以減少應用程序的負擔。
PACK模型:應用程序不必處理分包與數據抓取,組件保證每個OnReceive事件都向應用程序提供一個完整數據包。
3.2發送策略
對於IClient系列組件,當應用程序調用組件的Send()、SendPackets()、SendSmallFile()方法發送數據時,組件內部會把數據緩存起來,在適當的時機再發送出去。
對於IServer和IAgent系列組件,當應用程序調用組件Send()、SendPackets()、SendSmallFile()發送數據時,根據不同的發送策略會有不同的處理方式。
發送策略通過SetSendPolicy(enSendPolicy)方法進行設置。
1.SP_PACK 打包策略
2.SP_SAFE 安全策略
3.SP_DIRECT 直接策略:對每一個發送操作都直接投遞,適用於負載不高但要求實時性較高的場合。
4.OnSend 同步策略,V5.4.2開始:IServer和IAgent系列支持對OnSend事件設置同步策略,通過SetOnSendSyncPolicy(enSyncPolicy)方法設置。其三個屬性OSSP_NONE(不同步,可能同時觸發OnReceive和OnClose事件);OSSP_CLOSE(只同步OnClose事件,可能同時觸發OnReceive事件);OSSP_RECEIVE(只用於TCP組件,同步OnReceive和OnClose事件,不可能同時觸發他們)。
5.地址重用策略 v5.7.x開始:通過SetReuseAddressPolicy方法進行設置,三個屬性RAP_NONE,RAP_ADDR_ONLY,RAP_ADDR_AND_PORT
3.3 連接方式
HP-Socket所有組件的通信過程都是異步的,但IClient和IAgent組件向服務器發起連接的過程可以是同步或異步的,重點講同步連接:組件的連接方法IClient-Start(),IAgent-Connect()等到建立連接成功或失敗了再返回。
3.4連接綁定
1.對於IClient系列組件,一個組件對象對應一個ConnectionID 和一個通信連接,Send/SetExtra/GetExtra方法發送,綁定和獲取附加數據。
2.對於IServer和IAgent系列組件,一個組件對象管理多個通信連接,HP-Socket把通信連接抽象為ConnectionID,應用程序與組件交互時,需要指定ConnectionID來告知組件處理哪個連接。注意需要維護一張映射表,通過GetConnectionExtra方法進行。
3.5停止等待
Wait(),組件停止后自動退出程序。
