高性能 TCP & UDP 通訊框架 HP-Socket v3.3.1

HP-Socket

  HP-Socket 是一套通用的高性能 TCP/UDP 通訊框架,包含服務端組件、客戶端組件和 Agent 組件,普遍適用於各類不一樣應用場景的 TCP/UDP 通訊系統,提供 C/C++、C#、Delphi、E(易語言)、Java、Python 等編程語言接口。HP-Socket 對通訊層實現徹底封裝,應用程序沒必要關注通訊層的任何細節;HP-Socket 提供基於事件通知模型的 API 接口,能很是簡單高效地整合到新舊應用程序中。html

  爲了讓使用者能方便快速地學習和使用 HP-Socket,迅速掌握框架的設計思想和使用方法,特此精心製做了大量 Demo 示例(如:PUSH 模型示例、PULL 模型示例、性能測試示例以及其它編程語言示例)。HP-Socket 目前運行在 Windows 平臺,未來會實現跨平臺支持。java

----------------------------------------------------------------編程

通用性緩存

  • HP-Socket 的惟一職責就是接收和發送字節流,不參與應用程序的協議解析等工做。
  • HP-Socket 與應用程序經過接口進行交互,並徹底解耦。任何應用只要實現了 HP-Socket 的接口規範均可以無縫整合 HP-Socket。

易用性安全

  易用性對全部通用框架都是相當重要的,若是太難用還不如本身重頭寫一個來得方便。所以,HP-Socket 的接口設計得很是簡單和統一。服務器

  HP-Socket 徹底封裝了全部底層通訊細節,應用程序沒必要也不能干預底層通訊操做。通訊鏈接被抽象爲 Connection ID,Connection ID 做爲鏈接的惟一標識提供給應用程序來處理不一樣的鏈接。架構

高性能併發

  HP-Socket 做爲底層的通用框架,性能是關鍵指標,絕對不能成爲系統的瓶頸。HP-Socket 在設計上充分考慮性能、使用場景、複雜性和易用性等因素,做出如下幾點設計決策:app

  • Client 組件:基於 Event Select 通訊模型,在單獨線程中執行通訊操做,避免與主線程或其餘線程相互干擾。每一個組件對象管理一個 Socket 鏈接。
  • Server 組件:基於 IOCP 通訊模型,並結合緩存池、私有堆(Private Heap)等技術,支持超大規模鏈接,在高併發場景下實現高效內存管理。
  • Agent 組件:對於代理服務器或中轉服務器等應用場景,服務器自身也做爲客戶端向其它服務器發起大規模鏈接,一個 Agent 組件對象同時可管理多個 Socket 鏈接;Agent 組件與 Server 組件採用相同的技術架構,能夠用做代理服務器或中轉服務器的客戶端部件。

伸縮性框架

  應用程序可以根據不一樣的容量要求、通訊規模和資源情況等現實場景調整 HP-Socket 的各項性能參數(如:工做線程的數量、緩存池的大小、發送模式和接收模式等),優化資源配置,在知足應用需求的同時沒必要過分浪費資源。

   (項目主頁:點擊這裏,下載地址:點擊這裏)


*** v3.3.1更新 ***

 > 組件接口調整:

-----------------
  1. IClientListener 監聽器接口用 IClient* 參數取代 CONNID 參數標識 Client 組件對象
  2. 增長 IPullClient 接口,用做 PULL Client 組件的基接口
  3. IPullSocket 和 IPullClient 接口增長 Peek() 方法用於窺探緩衝區數據(不會移除緩衝區數據)
  4. 增長 IComplexSocketListener 監聽器接口,用做 Server/Agent 組件的監聽器基接口
  5. IComplexSocketListener 提供 OnShutdown 通知方法取代 Server/Agent 組件原來的 OnServerShutdown/OnAgentShutdown
  6. IClient組件增長 Get/SetExtra() 方法用於保存自定義附加數據
  7. IServer 和 IAgent 組件增長「靜默鏈接處理」相關方法:
    1) DisconnectSilenceConnections():// 斷開超過指定時長的靜默鏈接
    2) GetSilencePeriod():// 獲取某個鏈接靜默時間(毫秒)
    3) SetMarkSilence():// 設置是否標記靜默時間
    4) IsMarkSilence():// 檢測是否標記靜默時間

 > 增長 UdpCast 通訊組件:

-----------------
  1. UdpClient / UdpServer 用於 C/S 模式的點對點單播通訊,但在某些應用場景下,須要用到組播或廣播通訊
  2. UdpCast 實現了組播或廣播通訊,UdpCast 提供 IUdpCast 接口,該接口繼承自 IClient,有如下接口方法:
    /* 1) 通知接口方法: */
      OnPrepareConnect(IClient* pClient, SOCKET socket)
      OnConnect(IClient* pClient)
      OnSend(IClient* pClient, const BYTE* pData, int iLength)
      OnReceive(IClient* pClient, const BYTE* pData, int iLength)
      OnClose(IClient* pClient)
      OnError(IClient* pClient, EnSocketOperation enOperation, int iErrorCode)
    
    /* 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, int iOffset = 0)
      SendPackets(const WSABUF pBuffers[], int iCount)
  3. 增長 UdpCast 使用示例:TestUDPCast

> 升級說明:

-----------------
  1. HP-Socket v3.3.1 在功能上兼容 HP-Socket v3.2.3 版本,但代碼級別不徹底兼容
  2. HP-Socket v3.2.3 升級到 HP-Socket v3.3.1 須要注意如下調整:
    1) Client 組件
      a) IClientListener 監聽器接口調整,全部通知方法的參數有調整
      b) PULL Client 用 IPullClient 做爲基接口,Fetch()/Peek()方法參數有調整
    2) Agent/Server 組件
      a) OnShutdown 取代 OnServerShutdown/OnAgentShutdown

*** v3.2.3更新 ***

 > common-src 優化:

-----------------
  1. 優化通訊組件的同步機制
  2. 總體性能提高約 10%

> 升級說明:

-----------------
  1. 使用 HP-Socket v3.2.2 及之前版本的應用程序能夠安全升級到 HP-Socket v3.2.3

*** v3.2.2 更新 ***

 > 增長若干幫助方法:

-----------------
  1. 批量發送方法 SendPackets()
    1) IClient/IServer/IAgent 增長方法 SendPackets(dwConnID, pBuffers[], iBufferCount)
    2) 對於 TCP 組件 - 順序發送全部數據包
    3) 對於 UDP 組件 - 把全部數據包組合成一個數據包發送(總長度不能大於 UDP 包最大長度)
  2. 小文件發送方法 SendSmallFile()
    1) ITcpClient/ITcpServer/ITcpAgent 增長方法 SendSmallFile(lpszFileName, pHead, pTail)
    2) 經過 pHead 和 pTail 參數,能夠分別在文件數據的頭部和尾部加入自定義數據
    3) SendSmallFile() 只能發送 4096 KB 之內大小的文件
  3. HPSocket.dll 和 HPSocket4C.dll 增長如下導出方法
    1) SYS_WSAGetLastError():調用系統的 WSAGetLastError()
    2) SYS_SetSocketOption():調用系統的 setsockopt()
    3) SYS_GetSocketOption():調用系統的 getsockopt()
    4) SYS_IoctlSocket()	:調用系統的 ioctlsocket()
    5) SYS_WSAIoctl()	:調用系統的 WSAIoctl()

> 升級說明:

-----------------
  1. 使用 HP-Socket v3.2.1 及之前版本的應用程序能夠安全升級到 HP-Socket v3.2.2

*** v3.2.1 更新 ***

 > 增長 TcpAgent / TcpPullAgent 通訊組件:

-----------------
  1. 對於代理服務器或中轉服務器等應用場景,服務器自身也做爲客戶端向其它服務器發起大規模鏈接
  2. TcpClient / TcpPullClient 基於 Event Select 通訊模型,每一個組件對象管理一個 Socket,並開啓一個線程,不適合上述應用場景
  3. TcpAgent / TcpPullAgent 基於 IOCP 通訊模型,一個組件對象管理多個 Socket,適合用做代理服務器或中轉服務器的客戶端通訊組件
  4. 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 模型)
  5. 增長 TcpAgent / TcpPullAgent 使用示例:Agent-PFM / Agent-Pull / Agent-4C

  6. 增長 TcpAgent + TcpServer 實現的 HTTP 代理服務器示例:HttpProxy

> 增長 HPSocket for Java SDK:

-----------------
  1. 提供 Java 開發包:hpsocket-3.2.1.jar(經過 JNA 實現,目前只支持 Windows 平臺)
  2. 運行環境:JDK 1.6+,JVM 運行在 server 模式("java -server",在 client 模式下性能受影響)
  3. MBCS 和 Unicode 版本分佈位於包 org.jessma.hpsocket.mbcs 和 org.jessma.hpsocket.unicode
  4. HPSocket for Java SDK 提供如下通訊組件:
    1) TcpServer:TCP 通訊服務端組件,支持 PUSH/PULL 模型
    2) TcpClient:TCP 通訊客戶端組件,支持 PUSH/PULL 模型
    3) TcpAgent :TCP 通訊 Agent 組件,支持 PUSH/PULL 模型
    4) UdpServer:UDP 通訊服務端組件,支持 PUSH 模型
    5) UdpClient:UDP 通訊客戶端組件,支持 PUSH 模型
  5. HPSocket4J 的使用方法(以 TcpAgent 爲例):
    /* 0: 應用程序加入 hpsocket-3.2.1.jar 和 jna-4.1.0.jar */
    
    /* 1: 建立通訊組件對象 */
    TcpAgent agent = TcpAgent.create(Mode.PUSH);
    
    /* 2: 設置回調函數對象 */
    // (可選)
    agent.setCallBackOnPrepareConnect(new OnPrepareConnectImpl());
    // (可選)
    agent.setCallBackOnConnect(new OnConnectImpl());
    // (必須)PUSH 模型須要設置 OnReceive 回調函數對象
    agent.setCallBackOnReceive(new OnReceiveImpl());
    // (必須)PULL 模型須要設置 OnPullReceive 回調函數對象
    // 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:鏈接服務器 */
    agent.connect("localhost", (short)5555, pdwConnID);
    
    /* 5:處理通訊數據 */
    // 響應 OnReceive / OnPullReceive 事件接收數據
    // 使用 agent.send(dwConnID, data, data.length) 發送數據
    
    /* 6:關閉通訊組件 */
    agent.stop();
    
    /* 7:銷燬通訊組件 */
    TcpAgent.destroy(agent);
  6. 增長示例工程 TestEcho-4J,展現 HPSocket4J 的使用方法(包括 PULL 模型示例和性能測試示例)

> 優化數據收發策略:

-----------------
  1. Server 和 Agent 組件提供如下三種數據發送策略
    1)PACK - 打包模式(默認):儘可能把多個發送操做的數據組合在一塊兒,增長傳輸效率
    2)SAFE - 安全模式	  :儘可能把多個發送操做的數據組合在一塊兒,控制傳輸速度,避免緩衝區溢出
    3)DIRECT - 直接模式	  :對每個發送操做都直接投遞,適用於負載不高但要求實時性較高的場合
  2. Server 和 Agent 組件提供如下兩種數據接收策略
    1)SERIAL - 串行模式(默認):順序觸發同一鏈接的 OnReceive 和 OnClose/OnError 事件
    2)PARALLEL - 並行模式:在不一樣的通訊線程中同時觸發同一鏈接的 OnReceive 和 OnClose/OnError 事件

*** v3.1.3 更新 ***

 > 增長其它語言 Demo:

-----------------
  1. C#
  2. Delphi
  3. E 語言

> Bug Fix:

-----------------
  1. 修復 IP 地址判斷錯誤 Bug
     
    1) 客戶端鏈接服務器時,若是服務器 IP 地址滿位(12個數字:‘AAA.BBB.CCC.DDD’),IP 地址解析錯誤
    2) 影響組件:全部 TCP/UDP 客戶端組件
    3) 影響版本:v3.1.2 及以前全部版本
     
  2. 修復域名或主機名的 IP 地址解析錯誤 Bug
     
    1) 客戶端組件經過域名或主機名鏈接服務器時,可能會解析到錯誤的 IP 地址
    2) 影響組件:全部 TCP/UDP 客戶端組件
    3) 影響版本:v3.1.2 及以前全部版本

*** v3.1.2 更新 ***

 > 修改 Server 組件的 OnClose() / OnError() 事件的觸發規則:

-----------------
  1. 之前版本的 TCP/UDP Server 組件中,當關閉一個鏈接時可能會同時觸發一個 OnClose() 事件和若干個 OnError() 事件
  2. 因爲存在上述可能性,因此應用程序須要對 OnClose() / OnError() 的處理事件代碼段進行同步
  3. 從 v3.1.2 開始,當多個 OnClose() / OnError() 事件同時發生時,組件只會嚮應用程序通知第一個事件,後續事件則忽略
  4. 所以,應用程序在處理 OnClose() / OnError() 事件時沒必要處理同步,減小了出錯的可能和編寫同步及檢測代碼的負擔
  5. 示例代碼

    /* 示例代碼一:*/
    /*----------------------------------------------------------------------------*/
    ISocketListener::EnHandleResult CServerDlg::OnClose(CONNID dwConnID)
    {
    	// 之前版本:有可能存在併發的 OnClose()/OnError(),要把代碼放在臨界區中並檢測返回值
    
    	CCriSecLock locallock(m_csPkgInfo);	// <-- 臨界區
    
    	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() 事件,能安全地移除臨界區代碼和檢測代碼
    
    	PVOID pInfo = nullptr;
    	m_Server->GetConnectionExtra(dwConnID, &pInfo);
    	ASSERT(pInfo != nullptr);
    
    	delete pInfo;
    }

*** v3.1.1 更新 ***

 > 增長導出純 C 函數的動態連接庫 HPSocket4C.dll:

-----------------
  1. 增長代碼文件 HPSocket4C.h 和 HPSocket4C.cpp,用於建立 HPSocket4C.dll
  2. 導出純 C 函數,讓其它語言(如:C/C#/Delphi 等)能方便地使用 HPSocket
  3. HPSocket4C.dll 使用方法
    方法一:
    ------------------------------------------------------------------------------
    (0) (C/C++ 程序)包含 HPSocket4C.h 頭文件
    (1) 調用 ::Create_HP_XxxListener() 函數建立監聽器對象
    (2) 調用 ::Create_HP_Xxx(pListener) 函數建立 HPSocket 對象
    (3) 調用 ::HP_Set_FN_Xxx_OnYyy(pListener, ...) 函數設置監聽器的回調函數
    (4) 調用相關導出函數操做 HPSocket 對象
    (5) ...... ......
    (6) 調用 ::Destroy_HP_Xxx(pSocket) 函數銷燬 HPSocket 對象
    (7) 調用 ::Destroy_HP_XxxListener(pListener) 函數銷燬監聽器對象
    
    方法二:
    ------------------------------------------------------------------------------
    (1) 應用程序把須要用到的導出函數封裝到特定語言的包裝類中
    (2) 經過包裝類封裝後,以面向對象的方式使用 HPSocket
  4. 動態連接庫發行版本
    (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 緩存機制:

-----------------
  1. Common/Src 增長代碼文件 bufferpool.h 和 bufferpool.cpp,實現 Buffer Pool 緩存機制
  2. 經過 Buffer Pool 緩存機制提高內存使用效率,減小動態內存分配和釋放操做,避免內存空洞
  3. ICTcpClient 用 CItemPool 和 TItemList 實現發送緩衝區
  4. CUdpClient 用 CItemPool 和 TItemList 實現發送緩衝區
  5. CTcpPullClient 用 CItemPool 和 TItemList 實現發送緩衝區和 PULL 緩衝區
  6. CTcpPullServer 用 CBufferPool 和 TBuffer 實現 PULL 緩衝區

*** v3.0.2 更新 ***

 > 把 HP-Socket 編譯爲動態連接庫:

-----------------

  1. 應用程序能夠經過導入源代碼或動態連接庫方式使用 HP-Socket
  2. 動態連接庫使用方法
    方法一:
    ------------------------------------------------------------------------------
    (0) 應用程序包含 SocketInterface.h 和 HPSocket.h 頭文件
    (1) 調用 HP_Create_Xxx() 函數建立 HPSocket 對象
    (2) 使用完畢後調用 HP_Destroy_Xxx() 函數銷燬 HPSocket 對象
    
    方法二:
    ------------------------------------------------------------------------------
    (0) 應用程序包含 SocketInterface.h 和 HPSocket.h 頭文件
    (1) 建立 CXxxWrapper 包裝器,經過包裝器智能指針使用 HPSocket 對象
  3. 動態連接庫發行版本
    (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 通訊組件:

-----------------

  1. 新增兩個 UDP 通訊組件:CUdpServer 爲服務端組件,CUdpClient 爲客戶端組件
  2. 服務端組件 CUdpServer 採用 IOCP 通訊模型
  3. 客戶端組件 CUdpClient 採用 Event Select 通訊模型
  4. UDP 通訊組件的接口與原 TCP 通訊組件一致,簡單實用
  5. UDP 通訊組件內置通訊線路自動監測機制
  6. 新增 UDP 通訊組件示例工程 TestEcho-UDP

> 代碼重構與優化:

-----------------

  1. 規範全部接口、類以及代碼文件的命名
  2. 重構和優化了大量組件代碼
  3. 服務端組件加入讀寫鎖機制,有效平衡處理性能與安全性
  4. 服務端組件的 Socket 對象緩存列表設置了鎖定時間,提升訪問的安全性
相關文章
相關標籤/搜索