高性能网络通信框架 HP-Socket 推荐指数6星★★★★★★

HP-Socket是一款高性能的TCP/UDP/HTTP通信框架,支持多种编程语言。本文介绍如何使用其PACK模型实现C#下的TCP通信,包括服务端与客户端的搭建步骤及注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里写图片描述

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

为了让使用者能方便快速地学习和使用 HP-Socket ,迅速掌握框架的设计思想和使用方法,特此精心制作了大量 Demo 示例(如:PUSH 模型示例、PULL 模型示例、PACK 模型示例、性能测试示例以及其它编程语言示例)。HP-Socket 目前支持 Windows 和 Linux 平台。
详细介绍请看: https://www.oschina.net/p/hp-socket

因为HP-Socket 的PACK模型自动处理了TCP协议socket通信的分包、组包、粘包、心跳等,对于一些没有特殊要求的应用是很好的选择,下面就说说在C#中如何使用HP-Socket 的PACK模型来做TCP通信的服务端和客户端。

不想看大段啰嗦,只想看源代码的,OK,练习程序源代码下载地址:http://pan.baidu.com/s/1skCD7jv

更新记录:

2017-02-20

HP-Socket 库文件更新至4.1,根据新库文件,略微修改了源代码,主要是事件处理函数的参数变了

2017-02-21

简化非UI线程访问UI线程的方法

一、下载HP-Socket

推荐去github下载,包含了C++源代码和其他语言可用的DLL,下载并解压后,在 HP-Socket-master\HP-Socket\Bin\HPSocket4CS 目录下可以看到32位和64位2个版本的C#可用的DLL。

二、创建解决方案

创建一个名为“HP_Socket_Practice”的解决方案(windows应用程序),在该解决方案下新建2个项目“TCP_Pack_Client”和“TCP_Pack_Server”

在解决方案文件夹下新建一个名为“DLL”的文件夹,拷贝 HP-Socket-master\HP-Socket\Bin\HPSocket4CS\x86 目录下的“HPSocket4C_U.dll”和“HPSocketCS.dll”到刚才创建的“DLL”文件夹。

在“TCP_Pack_Client”和“TCP_Pack_Server”这2个项目中都添加引用“DLL”文件夹内的“HPSocketCS.dll”,并添加 using HPSocketCS; 语句

这样还没完成,因为只有“HPSocketCS.dll”还不能使用HP-Socket,还必须将“HPSocket4C_U.dll”分别拷贝到“TCP_Pack_Client”和“TCP_Pack_Server”这2个项目的目标文件夹,也就是与EXE程序放到一起,在debug模式下是 \bin\debug 目录,如果我们改变了EXE文件的生成位置,又要手动拷贝一次。

这里有2个概念要分清楚,“HPSocketCS.dll”(C#引入HP-Socket的P/Invoke类)这个文件是我们在项目里引用了,所以每次生成EXE文件都会自动拷贝到生成目录,“HPSocket4C_U.dll”(HP-Socket库,C++编写的)这个文件我们无法直接引用,所以要手动将“HPSocket4C_U.dll”拷贝到生成目录。

有没有办法让VS每次生成EXE的时候自动将相关的文件拷贝过来呢?答案是肯定的。

分别右键点击“TCP_Pack_Client”和“TCP_Pack_Server”这2个项目,选择属性–生成事件–后期生成事件命令行,输入 copy “ (SolutionDir)DLL\HPSocket4CU.dll"" ( S o l u t i o n D i r ) D L L \HPSocket 4 C U . d l l "" (TargetDir)” ,这样这2个项目每次生成的时候都会到“DLL”文件夹下拷贝“HPSocket4C_U.dll”文件到生成目录。点击”编辑后期生成事件“–”宏“可以看到 (SolutionDir) ( S o l u t i o n D i r ) 和 (TargetDir)的意思。

三、创建界面

分别为“TCP_Pack_Client”和“TCP_Pack_Server”这2个项目创建如下界面

四、编写代码

这里只讲下大概思路

客户端

1、创建 TcpPackClient 对象

2、绑定事件,TcpPackClient 共有5个事件要处理,OnPrepareConnect(开始连接前触发),OnConnect(连接成功后触发),OnSend(发送消息后触发),OnReceive(收到消息后触发),OnClose(连接关闭后触发)

3、设置包头标识和包体长度,需要注意的是,客户端和服务端的包头标识要相同才能通信

4、完成相关事件的事件处理方法,需要注意的是,所有的事件处理方法都是在非UI线程调用,所以不能在事件处理方法中直接更新UI,需要用到委托,还有就是不能在事件处理方法中调用Start()和Stop()方法

5、调用 client.Conncet(ip, port, checkBoxAsyncConn.Checked) 方法连接服务器(需要服务端先开启)

6、调用 client.Send(sendBytes, sendBytes.Length) 方法发送数据

7、调用 client.Stop() 方法断开连接

服务端

1、创建 TcpPackServer 对象

2、绑定事件,TcpPackServer 共有6个事件要处理,OnPrepareListen(绑定监听地址前触发),OnAccept(客户端连接请求被接受后触发),OnSend(发送消息后触发),OnReceive(收到消息后触发),OnClose(某个客户端连接关闭后触发),OnShutdown(服务端组件停止后触发)

3、设置包头标识和包体长度,需要注意的是,客户端和服务端的包头标识要相同才能通信

4、完成相关事件的事件处理方法,需要注意的是,所有的事件处理方法都是在非UI线程调用,所以不能在事件处理方法中直接更新UI,需要用到委托,还有就是不能在事件处理方法中调用Start()和Stop()方法

5、调用 server.Start() 方法启动服务端

6、调用 server.Send(connId, sendBytes, sendBytes.Length) 方法发送数据

7、调用 server.Stop() 方法停止服务端

五、运行效果

总结:.NET框架虽然提供了socket通信的类库,但是还有很多事情要自己处理,比如TCP协议需要处理分包、组包、粘包、维护连接列表等,UDP协议需要处理丢包、乱序,而且对于多连接并发,还要自己处理多线程。

HP-Socket的PACK模型基于TCP协议,自动处理分包、组包、粘包,使得应用程序只需要专注于业务逻辑处理,非常的实用,而且HP-Socket项目经过几年的沉淀,还是被证明非常的稳定,免费、开源、稳定、高效、详细的文档,无论从哪方面看,HP-Socket都应该算的上国产优秀的开源项目。

HP-Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架,包含服务端组件、客户端组件和Agent组件,广泛适用于各种不同应用场景的 TCP/UDP/HTTP 通信系统,提供 C/C++、C#、Delphi、E(易语言)、Java、Python 等编程语言接口。HP-Socket通信层实现完全封装,应用程序不必关注通信层的任何细节;HP-Socket 提供基于事件通知模型的 API 接口,能非常简单高效地整合到新旧应用程序中。    为了让使用者能方便快速地学习和使用 HP-Socket ,迅速掌握框架的设计思想和使用方法,特此精心制作了大量 Demo 示例(如:PUSH 模型示例、PULL 模型示例、PACK 模型示例、性能测试示例以及其它编程语言示例)。HP-Socket 目前运行在 Windows 平台,将来会实现跨平台支持。 [15:47 2018/11/05] 同步更新到5.4.2正式版 [10:37 2018/10/23] 1、英文模块IHttpSyncClient组件大改 2、IWinHttp组件添加若干命令(PS:忘记是哪些了。。。) 3、升级到5.4.2 rc3 版本 4、增加client同步例子 [10:30 2018/9/25] v5.4.2 更新: > SSL 组件更新: ----------------- 1、SSL 组件可以手工启动 SSL 握手,从而可以对 SSL/Https 通信执行代理服务器设置等前置操作 2、SSL 组件(Server/Agent/Client)增加以下接口方法支持手工启动 SSL 握手 1) StartSSLHandShake():手工启动 SSL 握手,当通信组件设置为非自动握手时,需要调用本方法启动 SSL 握手 2) SetSSLAutoHandShake():设置通信组件握手方式(默认:TRUE,自动握手) 3) IsSSLAutoHandShake():获取通信组件握手方式 > 其他功能更新: ----------------- 1、所有可能导致 Socket 关闭的组件接口方法都在 Socket 通信线程中异步触发 OnClose 事件 2、Server 与 Agent 组件的 DIRECT 发送策略也支持通过 GetPendingDataLength() 方法实现流控 3、Server 与 Agent 组件的 Disconnect() 方法不再支持‘非强制断开’(仍然保留bForce 参数),调用时都会强制断开 4、OnSend 事件支持 三种同步策略 1) OSSP_NONE:不同步(默认) 1) OSSP_CLOSE:同步 OnClose 1) OSSP_RECEIVE:同步 OnClose 和 OnReceive(只用于 TCP 组件) > 升级说明: ----------------- 1、HP-Socket v5.4.2 完全兼容 HP-Socket v5.4.1 版本,可以直接替换升级 [18:41 2018/8/27] 1、修复英文模块submit_task最后一个参数错误问题,莫名其妙变成了字节集 [11:04 2018/8/27] 1、更新hpsocket为 beta11 2、submit_task 提交的任务不用去管回调里面的ptask参数。内部自动处理。 [16:57 2018/8/24] 1、修复中文模块部分命令错误问题 2、修复英文模块几处命令错误问题 3、增加websocket例程,本来httpclient里面人,有些人就是装看不见。 4、更新hpsocket为 beta9 [12:57 2018/8/15] 1、修复模块汇编的bug,原因是取消了ww汇编库 [11:55 2018/8/15] 1、模块更新为beta8 2、新增api: HP_Agent_IsConnected  -->  Agent.IsConnected() HP_Client_IsConnected  -->  Client.IsConnected() HP_Server_IsConnected  -->  Server.IsConnected() [9:18 2018/8/6] 1、性能优化 2、由于某些人吐槽中文版模块吐槽的厉害,遂决定不再更新中文版。 3、\demo\old 目录下放的是以前旧的例程源码,并不再更新 [12:57 2018/8/1] 修改模块IBufferPtr类,具体调用方式查看 TestEcho-New-Agent.e TestEcho-New-Server.e TestEcho-Http-Serve.e TestEcho-Http-Serve-bigfile.e  改名为 TestEcho-Ht
v4.3.1 更新: > HTTP: 1、IHttpClient 和 IHttpAgent 组件兼容没有长度标识(如:Content-Length Header)的 HTTP 响应报文 2、IHttpClient 和 IHttpAgent 组件改进 HEAD 请求的响应处理方式,应用程序无需在 OnHeadersComplete 事件中返回特殊值 HPR_SKIP_BODY > 其它更新: 1、公共代码包 vc-common-src 版本升级到 v2.3.19 2、OpenSSL 版本升级到 1.1.0f 3、优化 IServer/IAgent 组件,提升性能和稳定性 > 升级说明: 1、HP-Socket v4.3.1 完全兼容 HP-Socket v4.2.1 版本,可以直接替换升级 v4.2.1 更新: > HTTP Cookie 管理: 1、新增 Cookie 管理器,可在不同连接、不同组件对象间共享 Cookie 2、Cookie 管理器实现了标准 HTTP Cookie 功能,支持 Max-Age、expires、httpOnly、secure 3、Cookie 管理器支持 Cookie 序列化与反序列化 4、IHttpClient 和 IHttpAgent 组件可通过 SetUseCookie() 方法设置是否开启 Cookie 功能 > HTTP Sync Client 通信组件: 1、Create_HP_HttpSyncClient 和 Create_HP_HttpsSyncClient 方法增加可选参数 pListener 2、如果 pListener 非空则可以通过 pListener 监听 HttpSyncClient 的所有通信事件 > 其它更新: 1、Demo 更新:HttpProxy,TestEcho-Http,TestEcho-Http-4C 2、公共代码包 vc-common-src 版本升级到 v2.3.18 3、OpenSSL 版本升级到 1.1.0e > 升级说明: 1、HTTP Sync Client 组件:需要调整 Create_HP_HttpSyncClient 和 Create_HP_HttpsSyncClient 的调用参数 2、其他组件HP-Socket v4.2.1 完全兼容 HP-Socket v4.1.x 版本,可以直接替换升级 v4.1.3 更新: > 代码调整: 1、修正 ITcpServer 和 ITcpAgent 组件的 Onclose 事件在 SP_DIRECT 发送模式下的触发规则 2、IClient 组件优化,提高稳定性 > 升级说明: 1、HP-Socket v4.1.3 完全兼容 HP-Socket v4.1.2 版本,可以直接替换升级 v4.1.2 更新: > 代码调整: 1、采用新环形缓冲区算法提高异步操作安全性 2、采用延时释放策略提高 HTTP 异步操作安全性 > 升级说明: 1、HP-Socket v4.1.2 完全兼容 HP-Socket v4.1.1 版本,可以直接替换升级 v4.1.1 更新: > WebSocket 支持: 1、所有 HTTP 组件增加 WebSocket 方法: 1) SendWSMessage(): 发送 WebSocket 数据包 2) GetWSMessageState(): 获取当前 WebSocket 状态 2、所有 HTTP 组件监听器增加 WebSocket 事件: 1) OnWSMessageHeader(): WebSocket 数据包头通知 2) OnWSMessageBody(): WebSocket 数据包体通知 3) OnWSMessageComplete(): WebSocket 数据包完成通知 3、示例 Demo TestEcho-Http 和 TestEcho-Http-4C 支持 WebSocket > 增加 HTTP Sync Client 通信组件: 1、HTTP Sync Client 实现同步 HTTP 通信,不需要事件监听器 2、HTTP Sync Client 组件类: CHttpSyncClient、CHttpsSyncClient 3、HTTP Sync Client 实现接口: ITcpClient / IHttpSyncRequester 4、示例 Demo TestEcho-Http 和 TestEcho-Http-4C 提供 HTTP Sync Client 示例 > 升级说明: 1、HP-Socket v4.1.1 完全兼容 HP-Socket v4.0.1 版本,可以直接替换升级 v4.0.1 更新: > 增加 HTTP 系列通信组件: 1、新增 HTT
1、连接池始终无法连接Mysql? 答:x86系统,可以安装5.34或者3.51版本的驱动;x64系统,推荐安装3.51版本的驱动。 ======================================================================= 2、为什么安装了驱动,还是无法连接Mysql数据库? 答:安装驱动后,请在连接池启动那里,修改驱动版本。比如安装的是3.51,那么就填写“3.51”;其他,请看参数说明。 ======================================================================= 3、MySql在64位下提示找不到odbc驱动问题 答:在64位机器上,如果你想要连接32位mysql ,一般会安装mysql connector/ODBC 64位,并在配置ODBC数据源测试中连接正常,但在程序连接,如ASP、asp.net、VB、Delphi 等软件访问数据库时,却提示找不到ODBC驱动。解决办法:因为你用的32位的mysql,那么你应该用32位的odbc配置管理器,而不是系统菜单默认的64位ODBC配置,请在 Windows\SysWOW64\ 下找到32位的ODBC配置工具 odbcad32.exe ,运行它,然后配置你需要的DSN。最后程序连接,测试OK。 ======================================================================= 4、连接池正确连接了,为什么还是无法查到数据? 答:因为参数填写不正确或者填写不完整,最后可能的是驱动版本这个参数填写错误; ======================================================================= 5、通信效率如何? 答:封装的是HPSocket通信组件,效率和稳定性没得说。 ======================================================================= 6、连接池除了Mysql,其他数据库能用吗? 答:常见的ACCESS、SQLITE3都是单机数据库,不支持多线程,所以采用连接池无意义。连接池Ex,支持MSSQL数据库,可以正常使用。 ======================================================================= 7、使用命令的过程中,出现BUG想砸电脑,几度怀疑人生,怎么办? 答:可以加入QQ群1013748987进行交流反馈。 ======================================================================= 8、我是小白,只想安安静静的学技术,加群能学到东西么? 答:这个要看群里老司机的表现了。 ======================================================================= 9、把服务端放在服务器上,为什么总是提示绑定失败? 答:请保证填写了正确的服务器地址和端口,保证服务器放行了指定端口。如果都正确无误,还是提示绑定失败,那么,请将地址改为本机的IP地址(右击网络邻居,查看属性,IP地址)。 ======================================================================= 10、如果数据库连接池启动成功,但是查询却失败了,怎么处理? 答:请检查数据库编码是否支持中文,在连接池启动参数那里的!编码,要与数据库编码一致! ======================================================================= 11、连接池ADO参数表如何使用? 答:参数表是为了杜绝SQL注入而设计的,整体操作流程如下: 数据库操作思路:→先绑定参数→增删改用 连接池.执行sql()命令;查询采用连接池.取记录集()命令→如果服务器返回的是连接池.取记录集(),客户端用记录集.导入()命令,导入服务器返回的数据。 ======================================================================= 12、连接池如何远程连接数据库? 答:可以通过Navicat等软件,将mysql的连接信息host改为%即可实现远程连接数据库。 ==============================================================
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值