本文为博主原创文章,未经博主容许不得转载。 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/docgit
* HP-Socket 源代码下载地址:https://github.com/ldcsaa/HP-Socketgithub
由于HP-Socket 的PACK模型自动处理了TCP协议socket通讯的分包、组包、粘包、心跳等,对于一些没有特殊要求的应用是很好的选择,下面就说说在C#中如何使用HP-Socket 的PACK模型来作TCP通讯的服务端和客户端。windows
不想看大段啰嗦,只想看源代码的,OK,练习程序源代码下载地址:http://pan.baidu.com/s/1skCD7jv服务器
更新记录:多线程
2017-02-20并发
HP-Socket 库文件更新至4.1,根据新库文件,略微修改了源代码,主要是事件处理函数的参数变了框架
2017-02-21socket
简化非UI线程访问UI线程的方法函数
1、下载HP-Socket 网站
推荐去github下载,包含了C++源代码和其余语言可用的DLL,下载并解压后,在 HP-Socket-master\HP-Socket\Bin\HPSocket4CS 目录下能够看到32位和64位2个版本的C#可用的DLL。
2、建立解决方案
建立一个名为“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)的意思。
3、建立界面
分别为“TCP_Pack_Client”和“TCP_Pack_Server”这2个项目建立以下界面
4、编写代码
这里只讲下大概思路
客户端
一、建立 TcpPackClient 对象
二、绑定事件,TcpPackClient 共有5个事件要处理,OnPrepareConnect(开始链接前触发),OnConnect(链接成功后触发),OnSend(发送消息后触发),OnReceive(收到消息后触发),OnClose(链接关闭后触发)
三、设置包头标识和包体长度,须要注意的是,客户端和服务端的包头标识要相同才能通讯
四、完成相关事件的事件处理方法,须要注意的是,全部的事件处理方法都是在非UI线程调用,因此不能在事件处理方法中直接更新UI,须要用到委托,还有就是不能在事件处理方法中调用Start()和Stop()方法
五、调用 client.Conncet(ip, port, checkBoxAsyncConn.Checked) 方法链接服务器(须要服务端先开启)
六、调用 client.Send(sendBytes, sendBytes.Length) 方法发送数据
七、调用 client.Stop() 方法断开链接
服务端
一、建立 TcpPackServer 对象
二、绑定事件,TcpPackServer 共有6个事件要处理,OnPrepareListen(绑定监听地址前触发),OnAccept(客户端链接请求被接受后触发),OnSend(发送消息后触发),OnReceive(收到消息后触发),OnClose(某个客户端链接关闭后触发),OnShutdown(服务端组件中止后触发)
三、设置包头标识和包体长度,须要注意的是,客户端和服务端的包头标识要相同才能通讯
四、完成相关事件的事件处理方法,须要注意的是,全部的事件处理方法都是在非UI线程调用,因此不能在事件处理方法中直接更新UI,须要用到委托,还有就是不能在事件处理方法中调用Start()和Stop()方法
五、调用 server.Start() 方法启动服务端
六、调用 server.Send(connId, sendBytes, sendBytes.Length) 方法发送数据
七、调用 server.Stop() 方法中止服务端
5、运行效果
总结:.NET框架虽然提供了socket通讯的类库,可是还有不少事情要本身处理,好比TCP协议须要处理分包、组包、粘包、维护链接列表等,UDP协议须要处理丢包、乱序,并且对于多链接并发,还要本身处理多线程。
HP-Socket的PACK模型基于TCP协议,自动处理分包、组包、粘包,使得应用程序只须要专一于业务逻辑处理,很是的实用,并且HP-Socket项目通过几年的沉淀,仍是被证实很是的稳定,免费、开源、稳定、高效、详细的文档,不管从哪方面看,HP-Socket都应该算的上国产优秀的开源项目。--------------------- 做者:clb929 来源:CSDN 原文:https://blog.csdn.net/clb929/article/details/51085983 版权声明:本文为博主原创文章,转载请附上博文连接!