HP-Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架,包含服务端组件、客户端组件和Agent组件,广泛适用于各种不同应用场景的 TCP/UDP/HTTP 通信系统,提供 C/C++、C#、Delphi、E(易语言)、Java、Python 等编程语言接口。
总之HPSocket应用非常简单,性能非常强大。
hpSocket官网:http://www.hpsocket.net
github地址:https://github.com/ldcsaa/HP-Socket
HPSocket主要以下特性:
通用性
HP-Socket 的唯一职责就是接收和发送字节流,不参与应用程序的协议解析等工作。(需要自己处理通信数据包的解包,组包等工作)
HP-Socket 与应用程序通过接口进行交互,并完全解耦。任何应用只要实现了HP-Socket的接口规范都可以无缝整合 HP-Socket。
易用性
易用性对所有通用框架都是至关重要的,如果太难用还不如自己重头写一个来得方便。因此,HP-Socket 的接口设计得非常简单和统一。
HP-Socket 完全封装了所有底层通信细节,应用程序不必也不能干预底层通信操作。通信连接被抽象为Connection ID,Connection ID 作为连接的唯一标识提供给应用程序来处理不同的连接。
HP-Socket 提供 PUSH / PULL / PACK 等接收模型, 应用程序可以灵活选择以手工方式、 半自动方式或全自动方式处理封解包, PULL / PACK 接收模型在降低封解包处理复杂度的同时能大大减少出错几率。
高性能
Server 组件:基于IOCP / EPOLL通信模型,并结合缓存池、私有堆等技术实现高效内存管理,支持超大规模、高并发通信场景。
Agent 组件:Agent组件实质上是Multi-Client组件,与Server组件采用相同的技术架构。一个Agent组件对象可同时建立和高效处理大规模Socket连接。
Client 组件:基于Event Select / POLL通信模型,每个组件对象创建一个通信线程并管理一个Socket连接,适用于小规模客户端场景。
伸缩性
应用程序能够根据不同的容量要求、通信规模和资源状况等现实场景调整 HP-Socket 的各项性能参数(如:工作线程的数量、缓存池的大小、发送模式和接收模式等),优化资源配置,在满足应用需求的同时不必过度浪费资源。
今天我把我使用的关于HPSocket部分有关记录下来以备忘。目前最新版本5.7.1,我下载的是5.6.1版本。
1.首先下载HP-Socket-master开发包,里面有所有关于HPSocket相关的文档和DEMO,很全。
2.打开vs2010,新建Win32控制台应用程序,名字HpSocketDemo1;
将HP-Socket-master\Windows目录下Common,Src两个文件夹拷贝到工程目录下;
拷贝HP-Socket-master\Windows\Demo\Global文件夹至工程目录下,如下
3.解决方案视图下,增加3个筛选器,"Common","Global","HPSocket",分别添加刚才拷贝过来的文件夹下对应的.h和.cpp文件,其中HPSocket筛选器则按需添加,服务端的话,就添加TcpServer.cpp, TcpServer.h,本篇实现的服务端demo。客户端的话,则添加客户端的cpp文件。当然这三个筛选器的名字可以自己取。
4.工程设置
4.1 工程属性改成“在共享DLL中使用MFC”
4.2 stdafx.h文件中添加一下几行
不添加_USE_MFC或者_ZLIB_DISABLED会报错,如下:
5.至此编译应该都是成功了,下面开始写测试demo
1)新增C++类TCPServerMgr 派生自 CTcpServerListener,转到定义看到CTcpServerListener是虚基类,所以派生子类首先要重写父类所有虚函数。
2)定义public函数用于控制Socket Server的启动,停止,发送数据等(接收数据,通过让客户端传入回调地址,以达到通知客户端有接收数据的功能)
3)注意组件中的OnReceive,OnSend,OnAccept,OnClose都是组件自主触发的,在这些函数中不应有费时的操作,也不应有加锁的公共变量。而应该另外开启线程,处理具体的业务逻辑代码。
最容易想到的办法是用vector保存接收到的数据,而在另一个线程中处理vector中的数据。这样能保证数据量很大的时候都不会阻塞OnReceive的触发。
4)在main函数中编写测试函数
void WINAPI OnTcpServerInterfaceCallBack(LPVOID lpContext, unsigned long lServerHandle, unsigned long lClientHandle, int nCmd, void *pData, int nLen)
{
switch (nCmd)
{
case TCPSERVER_CONNECT:
{
cout<<"client:"<
int _tmain(int argc, _TCHAR* argv[])
{
TCPServerMgr tcpServ(5555, OnTcpServerInterfaceCallBack);
tcpServ.Start();
system("pause");
return 0;
}
5)运行正常
至此TCPServerMgr类已经写完,测试代码也写完,稍作修改即可应用到自己的项目中。HPSocket框架自带的心跳,重连进制等都可以查看源码进行修改,以达到符合自己项目的需要。
但是还有后续还有很多工作需要做,比如协议的组包,解包等操作,传输时粘包、断包的处理等。
源码demo我已上传至我的资源,欢迎大家阅读指正。