HP-Socket學習總結


中文內容參考自優秀的國產高性能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(),組件停止后自動退出程序。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM