HP

Wesley13
• 阅读 622

本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/clb929/article/details/51085983
* HP-Socket 官方网站:http://www.jessma.org
* HP-Socket 项目主页:http://www.oschina.net/p/hp-socket
* HP-Socket 开发文档:http://www.oschina.net/p/hp-socket/doc

* HP-Socket 源代码下载地址:https://github.com/ldcsaa/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\HPSocket4C_U.dll" "$(TargetDir)" ,这样这2个项目每次生成的时候都会到“DLL”文件夹下拷贝“HPSocket4C_U.dll"文件到生成目录。点击”编辑后期生成事件“--”宏“可以看到$(SolutionDir)和$(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都应该算的上国产优秀的开源项目。
---------------------
作者:clb929
来源:CSDN
原文:https://blog.csdn.net/clb929/article/details/51085983
版权声明:本文为博主原创文章,转载请附上博文链接!

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Navicat for MySQL 查看BLOB字段内容
转:NavicatforMySQL查看BLOB字段内容版权声明:本文为博主原创文章,未经博主允许不得转载。https://blog.csdn.net/L905128009/article/details/75938472Navicatfor MySQL(https://www
Stella981 Stella981
3年前
Keras 时序模型
版权声明:本文为博主原创文章,未经博主允许不得转载。https://blog.csdn.net/Thinking\_boy1992/article/details/53207177本文翻译自(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fkeras.io%2Fgettingst
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这