zoukankan      html  css  js  c++  java
  • 高性能 TCP & UDP 通信框架 HP-Socket v3.2.2 正式公布

    HP-Socket

      HP-Socket 是一套通用的高性能 TCP/UDP 通信框架。包括服务端组件、client组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++、C#、Delphi、E(易语言)、Java、Python 等编程语言接口。HP-Socket 对通信层实现全然封装。应用程序不必关注通信层的不论什么细节;HP-Socket 提供基于事件通知模型的 API 接口,能很easy高效地整合到新旧应用程序中。

      为了让使用者能方便高速地学习和使用 HP-Socket。迅速掌握框架的设计思想和用法,特此精心制作了大量 Demo 演示样例(如:PUSH 模型演示样例、PULL 模型演示样例、性能測试演示样例以及其他编程语言演示样例)。

    HP-Socket 眼下执行在 Windows 平台,将来会实现跨平台支持。

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

    通用性

    • HP-Socket 的唯一职责就是接收和发送字节流,不參与应用程序的协议解析等工作。

    • HP-Socket 与应用程序通过接口进行交互,并全然解耦。不论什么应用仅仅要实现了 HP-Socket 的接口规范都能够无缝整合 HP-Socket。

    易用性

      易用性对全部通用框架都是至关重要的,假设太难用还不如自己重头写一个来得方便。因此,HP-Socket 的接口设计得很easy和统一。

      HP-Socket 全然封装了全部底层通信细节,应用程序不必也不能干预底层通信操作。通信连接被抽象为 Connection ID,Connection ID 作为连接的唯一标识提供给应用程序来处理不同的连接。

    高性能

      HP-Socket 作为底层的通用框架。性能是关键指标。绝对不能成为系统的瓶颈。

    HP-Socket 在设计上充分考虑性能、使用场景、复杂性和易用性等因素,作出下面几点设计决策:

    • Client 组件:基于 Event Select 通信模型。在单独线程中运行通信操作。避免与主线程或其他线程相互干扰。每一个组件对象管理一个 Socket 连接。
    • Server 组件:基于 IOCP 通信模型,并结合缓存池、私有堆(Private Heap)等技术。支持超大规模连接,在高并发场景下实现高效内存管理。

    • Agent 组件:对于代理server或中转server等应用场景,server自身也作为client向其他server发起大规模连接,一个 Agent 组件对象同一时候可管理多个 Socket 连接。Agent 组件与 Server 组件採用同样的技术架构,能够用作代理server或中转server的client部件。

    伸缩性

      应用程序可以依据不同的容量要求、通信规模和资源状况等现实场景调整 HP-Socket 的各项性能參数(如:工作线程的数量、缓存池的大小、发送模式和接收模式等),优化资源配置。在满足应用需求的同一时候不必过度浪费资源。

       (项目主页:点击这里,下载地址:点击这里)


    *** 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. 对于代理server或中转server等应用场景,server自身也作为client向其他server发起大规模连接
    2. TcpClient / TcpPullClient 基于 Event Select 通信模型,每一个组件对象管理一个 Socket。并开启一个线程,不适合上述应用场景
    3. TcpAgent / TcpPullAgent 基于 IOCP 通信模型,一个组件对象管理多个 Socket。适合用作代理server或中转server的client通信组件
    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 代理server演示样例: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 通信client组件,支持 PUSH/PULL 模型
      3) TcpAgent :TCP 通信 Agent 组件,支持 PUSH/PULL 模型
      4) UdpServer:UDP 通信服务端组件,支持 PUSH 模型
      5) UdpClient:UDP 通信client组件,支持 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. 添加演示样例project 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) client连接server时。假设server IP 地址满位(12个数字:‘AAA.BBB.CCC.DDD’),IP 地址解析错误
      2) 影响组件:全部 TCP/UDP client组件
      3) 影响版本号:v3.1.2 及之前全部版本号
       
    2. 修复域名或主机名的 IP 地址解析错误 Bug
       
      1) client组件通过域名或主机名连接server时,可能会解析到错误的 IP 地址
      2) 影响组件:全部 TCP/UDP client组件
      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 为client组件
    2. 服务端组件 CUdpServer 採用 IOCP 通信模型
    3. client组件 CUdpClient 採用 Event Select 通信模型
    4. UDP 通信组件的接口与原 TCP 通信组件一致。简单有用
    5. UDP 通信组件内置通信线路自己主动监測机制
    6. 新增 UDP 通信组件演示样例project TestEcho-UDP

    > 代码重构与优化:

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

    1. 规范全部接口、类以及代码文件的命名
    2. 重构和优化了大量组件代码
    3. 服务端组件增加读写锁机制。有效平衡处理性能与安全性
    4. 服务端组件的 Socket 对象缓存列表设置了锁定时间,提高訪问的安全性

  • 相关阅读:
    mac上python3安装HTMLTestRunner
    双目深度估计传统算法流程及OpenCV的编译注意事项
    深度学习梯度反向传播出现Nan值的原因归类
    1394. Find Lucky Integer in an Array
    1399. Count Largest Group
    1200. Minimum Absolute Difference
    999. Available Captures for Rook
    509. Fibonacci Number
    1160. Find Words That Can Be Formed by Characters
    1122. Relative Sort Array
  • 原文地址:https://www.cnblogs.com/brucemengbm/p/7140730.html
Copyright © 2011-2022 走看看