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(),组件停止后自动退出程序。

 

posted @ 2021-10-25 21:20  HelloWorld庄先生  阅读(2626)  评论(0编辑  收藏  举报