生活随笔
收集整理的這篇文章主要介紹了
高性能 TCP UDP 通信框架 HP-Socket v3.2.3
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服務(wù)端組件、客戶端組件和 Agent 組件,廣泛適用于各種不同應(yīng)用場景的 TCP/UDP 通信系統(tǒng),提供 C/C++、C#、Delphi、E(易語言)、Java、Python 等編程語言接口。HP-Socket 對通信層實現(xiàn)完全封裝,應(yīng)用程序不必關(guān)注通信層的任何細(xì)節(jié);HP-Socket 提供基于事件通知模型的 API 接口,能非常簡單高效地整合到新舊應(yīng)用程序中。
為了讓使用者能方便快速地學(xué)習(xí)和使用 HP-Socket,迅速掌握框架的設(shè)計思想和使用方法,特此精心制作了大量 Demo 示例(如:PUSH 模型示例、PULL 模型示例、性能測試示例以及其它編程語言示例)。HP-Socket 目前運行在 Windows 平臺,將來會實現(xiàn)跨平臺支持。
----------------------------------------------------------------
通用性
- HP-Socket 的唯一職責(zé)就是接收和發(fā)送字節(jié)流,不參與應(yīng)用程序的協(xié)議解析等工作。
- HP-Socket 與應(yīng)用程序通過接口進(jìn)行交互,并完全解耦。任何應(yīng)用只要實現(xiàn)了 HP-Socket 的接口規(guī)范都可以無縫整合 HP-Socket。
易用性
易用性對所有通用框架都是至關(guān)重要的,如果太難用還不如自己重頭寫一個來得方便。因此,HP-Socket 的接口設(shè)計得非常簡單和統(tǒng)一。
HP-Socket 完全封裝了所有底層通信細(xì)節(jié),應(yīng)用程序不必也不能干預(yù)底層通信操作。通信連接被抽象為 Connection ID,Connection ID 作為連接的唯一標(biāo)識提供給應(yīng)用程序來處理不同的連接。
高性能
HP-Socket 作為底層的通用框架,性能是關(guān)鍵指標(biāo),絕對不能成為系統(tǒng)的瓶頸。HP-Socket 在設(shè)計上充分考慮性能、使用場景、復(fù)雜性和易用性等因素,作出以下幾點設(shè)計決策:
- Client 組件:基于 Event Select 通信模型,在單獨線程中執(zhí)行通信操作,避免與主線程或其他線程相互干擾。每個組件對象管理一個 Socket 連接。
- Server 組件:基于 IOCP 通信模型,并結(jié)合緩存池、私有堆(Private Heap)等技術(shù),支持超大規(guī)模連接,在高并發(fā)場景下實現(xiàn)高效內(nèi)存管理。
- Agent 組件:對于代理服務(wù)器或中轉(zhuǎn)服務(wù)器等應(yīng)用場景,服務(wù)器自身也作為客戶端向其它服務(wù)器發(fā)起大規(guī)模連接,一個 Agent 組件對象同時可管理多個 Socket 連接;Agent 組件與 Server 組件采用相同的技術(shù)架構(gòu),可以用作代理服務(wù)器或中轉(zhuǎn)服務(wù)器的客戶端部件。
伸縮性
應(yīng)用程序能夠根據(jù)不同的容量要求、通信規(guī)模和資源狀況等現(xiàn)實場景調(diào)整 HP-Socket 的各項性能參數(shù)(如:工作線程的數(shù)量、緩存池的大小、發(fā)送模式和接收模式等),優(yōu)化資源配置,在滿足應(yīng)用需求的同時不必過度浪費資源。
(項目主頁:點擊這里,下載地址:點擊這里)
*** v3.2.3更新 ***
?>?common-src 優(yōu)化:
-----------------
優(yōu)化通信組件的同步機(jī)制整體性能提升約 10% >?升級說明:
-----------------
使用 HP-Socket v3.2.2 及以前版本的應(yīng)用程序可以安全升級到 HP-Socket v3.2.3
*** v3.2.2 更新 ***
?>?增加若干幫助方法:
-----------------
批量發(fā)送方法 SendPackets() 1) IClient/IServer/IAgent 增加方法 SendPackets(dwConnID, pBuffers[], iBufferCount)
2) 對于 TCP 組件 - 順序發(fā)送所有數(shù)據(jù)包
3) 對于 UDP 組件 - 把所有數(shù)據(jù)包組合成一個數(shù)據(jù)包發(fā)送(總長度不能大于 UDP 包最大長度) 小文件發(fā)送方法 SendSmallFile() 1) ITcpClient/ITcpServer/ITcpAgent 增加方法 SendSmallFile(lpszFileName, pHead, pTail)
2) 通過 pHead 和 pTail 參數(shù),可以分別在文件數(shù)據(jù)的頭部和尾部加入自定義數(shù)據(jù)
3) SendSmallFile() 只能發(fā)送 4096 KB 以內(nèi)大小的文件 HPSocket.dll 和 HPSocket4C.dll 增加以下導(dǎo)出方法 1) SYS_WSAGetLastError():調(diào)用系統(tǒng)的 WSAGetLastError()
2) SYS_SetSocketOption():調(diào)用系統(tǒng)的 setsockopt()
3) SYS_GetSocketOption():調(diào)用系統(tǒng)的 getsockopt()
4) SYS_IoctlSocket() :調(diào)用系統(tǒng)的 ioctlsocket()
5) SYS_WSAIoctl() :調(diào)用系統(tǒng)的 WSAIoctl() >?升級說明:
-----------------
使用 HP-Socket v3.2.1 及以前版本的應(yīng)用程序可以安全升級到 HP-Socket v3.2.2
*** v3.2.1 更新 ***
?>?增加 TcpAgent / TcpPullAgent 通信組件:
-----------------
對于代理服務(wù)器或中轉(zhuǎn)服務(wù)器等應(yīng)用場景,服務(wù)器自身也作為客戶端向其它服務(wù)器發(fā)起大規(guī)模連接TcpClient / TcpPullClient 基于 Event Select 通信模型,每個組件對象管理一個 Socket,并開啟一個線程,不適合上述應(yīng)用場景TcpAgent / TcpPullAgent 基于 IOCP 通信模型,一個組件對象管理多個 Socket,適合用作代理服務(wù)器或中轉(zhuǎn)服務(wù)器的客戶端通信組件TcpAgent / TcpPullAgent 的使用方式依然簡單,提供以下接口方法: /* 1) 通知接口方法 */
OnPrepareConnect(CONNID dwConnID, SOCKET socket)
OnConnect(CONNID dwConnID)
OnSend(CONNID dwConnID, const BYTE* pData, int iLength)
OnReceive(CONNID dwConnID, const BYTE* pData, int iLength) //(Push 模型)
OnReceive(CONNID dwConnID, int iLength) //(Pull 模型)
OnClose(CONNID dwConnID)
OnError(CONNID dwConnID, EnSocketOperation enOperation, int iErrorCode)
OnAgentShutdown()/* 2) 主要操作方法 */
Start(LPCTSTR pszBindAddress = nullptr, BOOL bAsyncConnect = TRUE)
Stop()
Connect(LPCTSTR pszRemoteAddress, USHORT usPort, CONNID* pdwConnID = nullptr)
Send(CONNID dwConnID, const BYTE* pBuffer, int iLength)
Disconnect(CONNID dwConnID, BOOL bForce = TRUE)
Fetch(CONNID dwConnID, BYTE* pData, int iLength) //(Pull 模型) 增加 TcpAgent / TcpPullAgent 使用示例:Agent-PFM / Agent-Pull / Agent-4C
增加 TcpAgent + TcpServer 實現(xiàn)的 HTTP 代理服務(wù)器示例:HttpProxy
>?增加 HPSocket for Java SDK:
-----------------
提供 Java 開發(fā)包:hpsocket-3.2.1.jar(通過 JNA 實現(xiàn),目前只支持 Windows 平臺)運行環(huán)境:JDK 1.6+,JVM 運行在 server 模式("java -server",在 client 模式下性能受影響)MBCS 和 Unicode 版本分布位于包 org.jessma.hpsocket.mbcs 和 org.jessma.hpsocket.unicodeHPSocket for Java SDK 提供以下通信組件: 1) TcpServer:TCP 通信服務(wù)端組件,支持 PUSH/PULL 模型
2) TcpClient:TCP 通信客戶端組件,支持 PUSH/PULL 模型
3) TcpAgent :TCP 通信 Agent 組件,支持 PUSH/PULL 模型
4) UdpServer:UDP 通信服務(wù)端組件,支持 PUSH 模型
5) UdpClient:UDP 通信客戶端組件,支持 PUSH 模型 HPSocket4J 的使用方法(以 TcpAgent 為例): /* 0: 應(yīng)用程序加入 hpsocket-3.2.1.jar 和 jna-4.1.0.jar *//* 1: 創(chuàng)建通信組件對象 */
TcpAgent agent = TcpAgent.create(Mode.PUSH);/* 2: 設(shè)置回調(diào)函數(shù)對象 */
// (可選)
agent.setCallBackOnPrepareConnect(new OnPrepareConnectImpl());
// (可選)
agent.setCallBackOnConnect(new OnConnectImpl());
// (必須)PUSH 模型需要設(shè)置 OnReceive 回調(diào)函數(shù)對象
agent.setCallBackOnReceive(new OnReceiveImpl());
// (必須)PULL 模型需要設(shè)置 OnPullReceive 回調(diào)函數(shù)對象
// agent.setCallBackOnPullReceive(new OnPullReceiveImpl());
// (可選)
agent.setCallBackOnSend(new OnSendImpl());
// (必須)
agent.setCallBackOnClose(new OnCloseImpl());
// (必須)
agent.setCallBackOnError(new OnErrorImpl());
// (可選)
agent.setCallBackOnAgentShutdown(new OnAgentShutdownImpl());/* 3:啟動通信組件 */
agent.start("127.0.0.1", false);/* 4:連接服務(wù)器 */
agent.connect("localhost", (short)5555, pdwConnID);/* 5:處理通信數(shù)據(jù) */
// 響應(yīng) OnReceive / OnPullReceive 事件接收數(shù)據(jù)
// 使用 agent.send(dwConnID, data, data.length) 發(fā)送數(shù)據(jù)/* 6:關(guān)閉通信組件 */
agent.stop();/* 7:銷毀通信組件 */
TcpAgent.destroy(agent); 增加示例工程 TestEcho-4J,展示 HPSocket4J 的使用方法(包括 PULL 模型示例和性能測試示例)
>?優(yōu)化數(shù)據(jù)收發(fā)策略:
-----------------
Server 和 Agent 組件提供以下三種數(shù)據(jù)發(fā)送策略 1)PACK - 打包模式(默認(rèn)):盡量把多個發(fā)送操作的數(shù)據(jù)組合在一起,增加傳輸效率
2)SAFE - 安全模式 :盡量把多個發(fā)送操作的數(shù)據(jù)組合在一起,控制傳輸速度,避免緩沖區(qū)溢出
3)DIRECT - 直接模式 :對每一個發(fā)送操作都直接投遞,適用于負(fù)載不高但要求實時性較高的場合 Server 和 Agent 組件提供以下兩種數(shù)據(jù)接收策略 1)SERIAL - 串行模式(默認(rèn)):順序觸發(fā)同一連接的 OnReceive 和 OnClose/OnError 事件
2)PARALLEL - 并行模式:在不同的通信線程中同時觸發(fā)同一連接的 OnReceive 和 OnClose/OnError 事件
*** v3.1.3 更新 ***
?>?增加其它語言 Demo:
-----------------
C#DelphiE 語言 > Bug Fix:
-----------------
修復(fù) IP 地址判斷錯誤 Bug
? 1) 客戶端連接服務(wù)器時,如果服務(wù)器 IP 地址滿位(12個數(shù)字:‘AAA.BBB.CCC.DDD’),IP 地址解析錯誤
2) 影響組件:所有 TCP/UDP 客戶端組件
3) 影響版本:v3.1.2 及之前所有版本 ?修復(fù)域名或主機(jī)名的 IP 地址解析錯誤 Bug
? 1) 客戶端組件通過域名或主機(jī)名連接服務(wù)器時,可能會解析到錯誤的 IP 地址
2) 影響組件:所有 TCP/UDP 客戶端組件
3) 影響版本:v3.1.2 及之前所有版本
*** v3.1.2 更新 ***
?> 修改 Server 組件的 OnClose() / OnError() 事件的觸發(fā)規(guī)則:
-----------------
以前版本的 TCP/UDP Server 組件中,當(dāng)關(guān)閉一個連接時可能會同時觸發(fā)一個 OnClose() 事件和若干個 OnError() 事件由于存在上述可能性,所以應(yīng)用程序需要對 OnClose() / OnError() 的處理事件代碼段進(jìn)行同步從 v3.1.2 開始,當(dāng)多個 OnClose() / OnError() 事件同時發(fā)生時,組件只會向應(yīng)用程序通知第一個事件,后續(xù)事件則忽略
因此,應(yīng)用程序在處理 OnClose() / OnError() 事件時不必處理同步,減少了出錯的可能和編寫同步及檢測代碼的負(fù)擔(dān)示例代碼
/* 示例代碼一:*/
/*----------------------------------------------------------------------------*/
ISocketListener::EnHandleResult CServerDlg::OnClose(CONNID dwConnID)
{// 以前版本:有可能存在并發(fā)的 OnClose()/OnError(),要把代碼放在臨界區(qū)中并檢測返回值CCriSecLock locallock(m_csPkgInfo); // <-- 臨界區(qū)PVOID pInfo = nullptr;// <-- 檢測返回值if(m_Server->GetConnectionExtra(dwConnID, &pInfo) && pInfo != nullptr){m_Server->SetConnectionExtra(dwConnID, nullptr);delete pInfo;}
}/* 示例代碼二:*/
/*----------------------------------------------------------------------------*/
ISocketListener::EnHandleResult CServerDlg::OnClose(CONNID dwConnID)
{// v3.1.2 版本:只會接收到一個 OnClose()/OnError() 事件,能安全地移除臨界區(qū)代碼和檢測代碼PVOID pInfo = nullptr;m_Server->GetConnectionExtra(dwConnID, &pInfo);ASSERT(pInfo != nullptr);delete pInfo;
}
*** v3.1.1 更新 ***
?> 增加導(dǎo)出純 C 函數(shù)的動態(tài)鏈接庫 HPSocket4C.dll:
-----------------
增加代碼文件 HPSocket4C.h 和 HPSocket4C.cpp,用于創(chuàng)建 HPSocket4C.dll導(dǎo)出純 C 函數(shù),讓其它語言(如:C/C#/Delphi 等)能方便地使用 HPSocket
HPSocket4C.dll 使用方法 方法一:
------------------------------------------------------------------------------
(0) (C/C++ 程序)包含 HPSocket4C.h 頭文件
(1) 調(diào)用 ::Create_HP_XxxListener() 函數(shù)創(chuàng)建監(jiān)聽器對象
(2) 調(diào)用 ::Create_HP_Xxx(pListener) 函數(shù)創(chuàng)建 HPSocket 對象
(3) 調(diào)用 ::HP_Set_FN_Xxx_OnYyy(pListener, ...) 函數(shù)設(shè)置監(jiān)聽器的回調(diào)函數(shù)
(4) 調(diào)用相關(guān)導(dǎo)出函數(shù)操作 HPSocket 對象
(5) ...... ......
(6) 調(diào)用 ::Destroy_HP_Xxx(pSocket) 函數(shù)銷毀 HPSocket 對象
(7) 調(diào)用 ::Destroy_HP_XxxListener(pListener) 函數(shù)銷毀監(jiān)聽器對象方法二:
------------------------------------------------------------------------------
(1) 應(yīng)用程序把需要用到的導(dǎo)出函數(shù)封裝到特定語言的包裝類中
(2) 通過包裝類封裝后,以面向?qū)ο蟮姆绞绞褂?HPSocket 動態(tài)鏈接庫發(fā)行版本 (1) x86/HPSocket4C.dll - (32位/MBCS/Release)
(2) x86/HPSocket4C_D.dll - (32位/MBCS/DeBug)
(3) x86/HPSocket4C_U.dll - (32位/UNICODE/Release)
(4) x86/HPSocket4C_UD.dll - (32位/UNICODE/DeBug)
(5) x64/HPSocket4C.dll - (64位/MBCS/Release)
(6) x64/HPSocket4C_D.dll - (64位/MBCS/DeBug)
(7) x64/HPSocket4C_U.dll - (64位/UNICODE/Release)
(8) x64/HPSocket4C_UD.dll - (64位/UNICODE/DeBug) > 全面啟用 Buffer Pool 緩存機(jī)制:
-----------------
Common/Src 增加代碼文件 bufferpool.h 和 bufferpool.cpp,實現(xiàn) Buffer Pool 緩存機(jī)制通過 Buffer Pool 緩存機(jī)制提升內(nèi)存使用效率,減少動態(tài)內(nèi)存分配和釋放操作,避免內(nèi)存空洞ICTcpClient 用 CItemPool 和 TItemList 實現(xiàn)發(fā)送緩沖區(qū)CUdpClient 用 CItemPool 和 TItemList 實現(xiàn)發(fā)送緩沖區(qū)CTcpPullClient 用 CItemPool 和 TItemList 實現(xiàn)發(fā)送緩沖區(qū)和 PULL 緩沖區(qū)CTcpPullServer 用 CBufferPool 和 TBuffer 實現(xiàn) PULL 緩沖區(qū)
*** v3.0.2 更新 ***
?> 把 HP-Socket 編譯為動態(tài)鏈接庫:
-----------------
應(yīng)用程序可以通過導(dǎo)入源代碼或動態(tài)鏈接庫方式使用 HP-Socket動態(tài)鏈接庫使用方法 方法一:
------------------------------------------------------------------------------
(0) 應(yīng)用程序包含 SocketInterface.h 和 HPSocket.h 頭文件
(1) 調(diào)用 HP_Create_Xxx() 函數(shù)創(chuàng)建 HPSocket 對象
(2) 使用完畢后調(diào)用 HP_Destroy_Xxx() 函數(shù)銷毀 HPSocket 對象方法二:
------------------------------------------------------------------------------
(0) 應(yīng)用程序包含 SocketInterface.h 和 HPSocket.h 頭文件
(1) 創(chuàng)建 CXxxWrapper 包裝器,通過包裝器智能指針使用 HPSocket 對象 動態(tài)鏈接庫發(fā)行版本 (1) x86/HPSocket.dll - (32位/MBCS/Release)
(2) x86/HPSocket_D.dll - (32位/MBCS/DeBug)
(3) x86/HPSocket_U.dll - (32位/UNICODE/Release)
(4) x86/HPSocket_UD.dll - (32位/UNICODE/DeBug)
(5) x64/HPSocket.dll - (64位/MBCS/Release)
(6) x64/HPSocket_D.dll - (64位/MBCS/DeBug)
(7) x64/HPSocket_U.dll - (64位/UNICODE/Release)
(8) x64/HPSocket_UD.dll - (64位/UNICODE/DeBug)
*** v3.0.1 更新 ***
?> 新增 UDP 通信組件:
-----------------
新增兩個 UDP 通信組件:CUdpServer 為服務(wù)端組件,CUdpClient 為客戶端組件服務(wù)端組件 CUdpServer 采用 IOCP 通信模型客戶端組件 CUdpClient 采用 Event Select 通信模型UDP 通信組件的接口與原 TCP 通信組件一致,簡單實用UDP 通信組件內(nèi)置通信線路自動監(jiān)測機(jī)制新增 UDP 通信組件示例工程 TestEcho-UDP> 代碼重構(gòu)與優(yōu)化:
-----------------
規(guī)范所有接口、類以及代碼文件的命名重構(gòu)和優(yōu)化了大量組件代碼服務(wù)端組件加入讀寫鎖機(jī)制,有效平衡處理性能與安全性服務(wù)端組件的 Socket 對象緩存列表設(shè)置了鎖定時間,提高訪問的安全性
轉(zhuǎn)載于:https://www.cnblogs.com/ldcsaa/p/3909980.html
總結(jié)
以上是生活随笔為你收集整理的高性能 TCP UDP 通信框架 HP-Socket v3.2.3的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。