HP-Socket 是一套通用的高性能 TCP/UDP Socket 组件,包含服务端组件、客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++、C#、Delphi、E(易语言)、Java、Python 等编程语言接口。HP-Socket 对通信层实现完全封装,上层应用不必关注通信层的任何细节;HP-Socket 提供基于事件通知模型的 API 接口,能非常简单高效地整合到新旧应用程序中。为了让使用者能方便快速地学习和使用 HP-Socket,迅速掌握组件的设计思想和使用方法,特此精心制作了大量 Demo 示例,包括 PUSH 模型示例、PULL模型示例和性能测试示例等。HP-Socket 目前运行在 Windows 平台,将来会实现跨平台支持。
----------------------------------------------------------------
通用性
- 通信组件的唯一职责就是接受和发送字节流,绝对不能参与上层协议解析等工作。
- 与上层使用者解耦、互不依赖,组件与使用者通过操作接口和监听器接口进行交互,组件实现操作接口为上层提供操作方法;使用者实现监听器接口把自己注册为组件的 Listener,接收组件通知。因此,任何使用者只要实现了监听器接口都可以使用组件;另一方面,甚至可以自己重新写一个实现方式完全不同的组件实现给使用者调用,只要该组件遵从组件的操作接口,这也是 DIP 设计原则的体现。
可用性
可用性对所有通用组件都是至关重要的,如果太难用还不如自己重头写一个来得方便。因此,组件的操作接口和监听器接口设计得尽量简单易用(通俗来说就是“傻瓜化”),这两个接口的主要方法均不超过 5 个。另外,组件完全封装了所有的底层 Socket 通信,上层应用看不到任何通信细节,不必也不能干预任何通信操作,Socket 连接被抽象为 Connection ID,该参数作为连接标识提供给上层应用识别不同的连接。
高性能
作为底层的通用组件,性能问题是必须考虑的,绝对不能成为系统的瓶颈。而另一方面,从实际出发,根据客户端组件与服务端组件的性能要求采用不同的 Socket 模型。组件在设计上充分考虑了性能、现实使用情景、可用性和实现复杂性等因素,确保满足性能要求的同时又不会写得太复杂。做出以下两点设计决策:
- 客户端:在单独线程中实现 Socket 通信交互,这样可以避免与主线程或其他线程相互干扰;I/O 模型选择 Event Select 通信模型。每个组件对象管理一个 Socket 连接。
- 服务端:采用高效的 IOCP 通信模型;利用缓存池技术,在通信的过程中,通常需要频繁的申请和释放内存缓冲区,建立了动态缓存池, 只有当缓存池中没有可用对象时才创建新对象,而当缓存对象过多时则会压缩缓存池;另外,组件的动态内存通过私有堆(Private Heap)机制分配,避免与 new / malloc 竞争同时又减少内存空洞。
- Agent:对于代理服务器或中转服务器等应用场景,服务器自身也作为客户端向其它服务器发起大规模连接,一个 Agent 组件对象管理多个 Socket 连接,与服务端采用相同的技术架构,可以用作代理服务器或中转服务器的客户端部件。
伸缩性
可以根据实际的使用环境要求设置组件的各项性能参数(如:工作线程的数量、各种缓存池的大小、收发缓冲区的大小、Socket 监听队列的大小、Accep 派发的数目以及心跳检查的间隔等)。
(项目主页:点击这里,下载地址:点击这里)
*** v3.2.1 更新 ***
> 增加 TcpAgent / TcpPullAgent 通信组件:
-----------------
- 对于代理服务器或中转服务器等应用场景,服务器自身也作为客户端向其它服务器发起大规模连接
- TcpClient / TcpPullClient 基于 Event Select 通信模型,每个组件对象管理一个 Socket,并开启一个线程,不适合上述应用场景
- TcpAgent / TcpPullAgent 基于 IOCP 通信模型,一个组件对象管理多个 Socket,适合用作代理服务器或中转服务器的客户端通信组件
- 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 实现的 HTTP 代理服务器示例:HttpProxy
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。