HP-Socket国产优秀socket通信组件推荐
来源:http://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都应该算的上国产优秀的开源项目。
HP-Socket国产优秀socket通信组件推荐的更多相关文章
- 软件推荐 ---一款优秀的通信组件 HP_Socket
* HP-Socket 官方网站:http://www.jessma.org* HP-Socket 项目主页:http://www.oschina.net/p/hp-socket* HP-Socket ...
- 基于 IOCP 的通用异步 Windows Socket TCP 高性能服务端组件的设计与实现
设计概述 服务端通信组件的设计是一项非常严谨的工作,其中性能.伸缩性和稳定性是必须考虑的硬性质量指标,若要把组件设计为通用组件提供给多种已知或未知的上层应用使用,则设计的难度更会大大增加,通用性.可用 ...
- C#的Socket实现UDP协议通信
今天稍花化了一点时间,利用C#的Socket验证了UDP的通信,为接下来特地利用UDP做个分布式的通信仿真系统打下基础.众所周知,UDP 就是用户数据报协议,在互联网参考模型的第四层——传输层.与TC ...
- Socket 两平台互相 通信 .NET
两个平台互相通信,对方发送数据过来,我方接收数据,对数据进行处理后发送结果给对方,对方进行相应的操作. 首页,我方开启服务监听: Socket socket = new Socket(AddressF ...
- 【Socket编程】Java通信是这样炼成的
简介 网络无处不在,移动互联时代也早已到来,单机版程序慢慢的已没有生命力,所有的程序都要能够访问网络,比如 QQ 网络聊天程序.迅雷下载程序等,这些程序都要同网络打交道,本次将与各位小伙伴们分享的就是 ...
- socket系列之socket服务端与客户端如何通信
上面已经分别介绍了ServerSocket跟Socket的工作步骤,并且从应用层往系统底层剖析其运作原理,我们清楚了他们各自的一块,现在我们将把他们结合起来,看看他们是如何通信的,并详细讨论一下他们之 ...
- UE4 Socket多线程非阻塞通信
转自:https://blog.csdn.net/lunweiwangxi3/article/details/50468593 ue4自带的Fsocket用起来依旧不是那么的顺手,感觉超出了我的理解范 ...
- Python的网络编程[0] -> socket[2] -> 利用 socket 建立 TCP/UDP 通信
Socket 目录 socket 的 TCP/IP 通信基本建立过程 socket 的 UDP 通信基本建立过程 socket 的 UDP 广播式通信基本建立过程 socket 的多线程通信建立过程 ...
- 一个 Java 的 Socket 服务器和客户端通信的例子
一个 HelloWord 级别的 Java Socket 通信的例子.通讯过程: 先启动 Server 端,进入一个死循环以便一直监听某端口是否有连接请求.然后运行 Client 端,客户端发出连接请 ...
随机推荐
- Python实现冒泡,选择排序
def bubble(num): for i in range(len(num)-1): for j in range(len(num)-i-1): if(num[j]>num[j+1]): t ...
- openlayers研究(一) 初始化流程
下载2.13.1.解压缩.根据readme解释,openlayers.js是一个压缩库,.light是一个图像显示的简化库,mobile顾名思义应该是应对移动设备的库.build里面有py写的打包工具 ...
- CPU纯软件全虚拟化技术
我们在前面的文章中提到了虚拟化技术的大致分类情况,即分为全虚拟化.半虚拟化和硬件辅助虚拟化3大类.而我们虚拟化技术最主要的虚拟主体就是我们的硬件CPU.内存和IO,那么我们的CPU在全虚拟化模式下如何 ...
- auto_ptr与shared_ptr ZZ
http://blog.csdn.net/rogeryi/article/details/1442700 Part(1) 这篇文章试图说明如何使用auto_ptr和shared_ptr,从而使得动态分 ...
- MyCAT源码分析——分析环境部署
为了更好地了解mycat的原理,计划对mycat源码进行通读一遍,根据实际业务环境进行相关源码优化. 一.环境描述 操作系统:windows 10 x64 软件:jdk 1.7+ maven ...
- 通信与实际用例应用(消息队列和进程撰写的ATM机与消息队列的五子棋对站)
int semget(key_t key, int nsems, int semflg); 功能:创建信号量或获取信号量 nsems:信号量的数量 semflg: IPC_CREAT|IPC_EXEC ...
- [翻译] FLAnimatedImage
FLAnimatedImage FLAnimatedImage is a performant animated GIF engine for iOS: FLAnimatedImage是一个播放gif ...
- [翻译] AJProgressPanel
AJProgressPanel Animated progress panel 可做动画的进度条 No images needed, all CoreGraphics code 不需要图片,使用Cor ...
- ASC日志保存时间更改
连接到数据库,选择 OperationsManagerAC,修改dtConfig表即可,新建查询: select * from dtConfig Update dtConfig set value=2 ...
- C#:安装Windows服务,动态指定服务名及描述(转载)
来源:http://www.cnblogs.com/Fooo/p/3476675.html Installer.cs public Installer() { InitializeComponent( ...