# 整体架构
HP-Socket完全封装了底层通信细节,并为应用程序提供一套简单易用的并且与底层通信完全无关的API接口,使应用程序获得高性能、高伸缩性通信的同时,免除处理通信细节的负担。HP-Socket的API接口模型如图1.1-1所示:

图1.1-1 HP-Socket API接口模型
HP-Socket定义了组件接口(如:ITcpServer / IUdpClient)、组件实现类(如:CTcpServer / CUdpClient)和监听器接口(如:ITcpServerListener / IUdpClientListener),其中:
**组件接口**:声明组件操作方法,应用程序创建组件对象后通过该接口来使用组件
**组件实现类**:实现组件接口,执行实际通信处理工作,并向监听器报告通信事件
**监听器接口**:声明组件的通信事件回调方法
每个组件对象都会关联一个监听器对象(监听器对象的实现类由应用程序定义),当组件对象触发一个通信事件时会调用监听器对象相应的回调方法,应用程序在回调方法中处理应用业务逻辑。图1.1-2以TCP Agent为例展示了组件与应用程序的交互:
应用程序首先创建监听器对象和TCP Agent对象,创建TCP Agent对象时传入监听器对象,把TCP Agent对象与监听器对象关联起来。TCP Agent对象创建完毕后,应用程序调用TCP Agent接口方法操作TCP Agent对象(如:Start / Connect / Send / Stop等)。当TCP Agent对象触发通信事件时,会调用监听器对象的回调方法(如:OnConnect / OnSend / OnReceive / Onclose等)通知应用程序。
**注意:监听器对象的异步回调方法是在组件的通信线程中执行的,因此回调方法不应执行耗时较长的业务逻辑代码,同时要注意多线程同步问题,也应尽量避免使用锁。
HP-Socekt通过设置“连接绑定”能协助应用程序巧妙地避免由于多线程同步和互斥锁等导致的复杂性和性能问题。**

# 组件分类
HP-Socket包含29个组件(其中9个SSL组件将在第3章详细讲解,8个HTTP组件将在第4章详细讲解),可根据通信角色(Client / Server)、通信协议(TCP / UDP/HTTP)和接收模型(PUSH / PULL / PACK)进行归类。表1.2-1列出了TCP / UDP组件的名称、接口、监听器接口、实现类及其分类:
| Name | Component Intface/Listener Intface | Implement Class | Role | Protocol | Recv |
| --- | --- | --- | --- | --- | --- |
| TCP Server | ITcpServer/ITcpServerListener | CTcpServer | Server | TCP | PUSH |
| TCP Pull Server | ITcpPullServer/ITcpServerListener | CTcpPullServer | Server | TCP | PULL |
| TCP Pack Server | ITcpPackServer/ITcpServerListener | CTcpPackServer | Server | TCP | PACK |
| UDP Server | IUdpServer/IUdpServerListener | CUdpServer | Server | UDP | PUSH |
| TCP Agent | ITcpAgent/ITcpServerListener | CTcpAgent | Client | TCP | PUSH |
| TCP Pull Agent | ITcpPullAgent/ITcpAgentListener | CTcpPullAgent | Client | TCP | PULL |
| TCP Pack Agent | ITcpPackAgent/ITcpServerListener | CTcpPackAgent | Client | TCP | PACK |
| TCP Client | ITcpClient/ITcpClientListener | CTcpClient | Client | TCP | PUSH |
| TCP Pull Client | ITcpPullClient/ITcpClientListener | CTcpPullClient | Client | TCP | PULL |
| TCP Pack Client | ITcpPackClient/ITcpClientListener | CTcpPackClient | Client | TCP | PACK |
| UDP Client | IUdpClient/IUdpClientListener | CUdpClient | Client | UDP |PUSH |
| UDP Cast | IUdpCast/IUdpCastListener | CUdpCast | Client | UDP | PUSH |
Agent组件本质上是Client组件,一个Agent对象能同时管理多个客户端连接
根据实际使用场景,HP-Socket中只实现了基于TCP和HTTP Agent组件
Cast组件是为组播和广播而设计的UDP组件,可认为是一种特殊的Client组件
基于TCP的组件都分别提供PUSH和PULL两种接收模型
# 组件接口
Server、Agent和Client的组件接口定义如图1.3-1 — 1.3-3所示,组件接口定义了组件提供的所有操作方法。其中,PULL模型接口多重继承于IPullSocket / IPullCliet接口,它提供了Fetch(dwConnID, pData, iDataLength) 方法,让应用程序从组件中拉取数据。



# 监听器接口
Server、Agent和Client的监听器接口定义如图1.4-1 — 1.4-3所示:



HP-Socket没有为PUSH / PULL / PACK模型组件定义单独的监听器接口,它们使用相同的监听器接口,区别在于:PUSH和PACK模型组件接收到数据时会触发监听器对象的OnReceive(pSender, dwConnID, pData, iLength) 事件,而PULL模型组件接收到数据时会触发监听器对象的OnReceive(pSender, dwConnID, iLength) 事件。事件的含义如表1.4-1所示:
**ISocketListenerT**
OnHandShake(pSender, dwConnID) 握手完成
OnSend(pSender, dwConnID, pData, iLength) 数据已发送
OnReceive(pSender, dwConnID, pData, iLength) 数据到达(PUSH)
OnReceive(pSender, dwConnID, iLength) 数据到达(PULL)
OnClose(pSender, dwConnID, enOperation, iErrorCode) 连接关闭
**IComplexSocketListenerT**
OnShutdown(pSender) 关闭组件
**IServerListenerT**
OnPrepareListen(pSender, soListen) 准备监听
OnAccept(pSender, dwConnID, soClient) 接受连接
**IAgentListenerT**
OnPrepareConnect(pSender, dwConnID, socket) 准备连接
OnConnect(pSender, dwConnID) 完成连接
**IClientListenerT**
OnPrepareConnect(pSender, dwConnID, socket) 准备连接
OnConnect(pSender, dwConnID) 完成连接
* * * * *
监听器事件回调方法返回值的类型为EnHandleResult:

HR_OK :成功处理
HR_IGNORE :忽略处理
HR_ERROR :处理失败
**注意:当OnReceive / OnPrepareListen / OnAccept / OnPrepareConnect / OnConnect / OnHandShake事件回调方法返回HR_ERROR时,组件会立即中断连接。
为了使非SSL组件和SSL组件的处理流程一致,HP-Socket v4.0.x开始,非SSL组件也会触发OnHandShake事件。因此,当组件接收到OnHandShake事件即说明连接已建立,并可以开始通信。**
