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都应该算的上国产优秀的开源项目。

时间: 2024-10-05 05:08:36

HP-Socket国产优秀socket通信组件推荐的相关文章

socket系列之socket服务端与客户端如何通信

上面已经分别介绍了ServerSocket跟Socket的工作步骤,并且从应用层往系统底层剖析其运作原理,我们清楚了他们各自的一块,现在我们将把他们结合起来,看看他们是如何通信的,并详细讨论一下他们之间相互通信的一些细节. 借助图2-3-2-4,想象一下你正在大学课室上着电脑,你跟你另外两个朋友觉得老师讲得课很菜,没必要听,于是你们仨都各自打开浏览器冲浪,刚好你们访问了同一台服务器,假如你用的是浏览器A,那么整个流程为: ① 浏览器确认目标IP跟目标端口号(http默认使用80端口),当然如果你

C语言 linux环境基于socket的简易即时通信程序

转载请注明出处:http://www.cnblogs.com/kevince/p/3891033.html   By Kevince 最近在看linux网络编程相关,现学现卖,就写了一个简易的C/S即时通信程序,代码如下: head.h 1 /*头文件,client和server编译时都需要使用*/ 2 #include <unistd.h> 3 #include <stdio.h> 4 #include <sys/types.h> 5 #include <sys

android使用socket进行本地PC通信

一.编写思路 手机端为客户端,PC为服务端,手机访问PC通信,需建立一个虚拟的通信链路,客户端通过socket发送请求到服务端,服务端通过serversocket监听来自客户端的socket请求,并生成一个socket.这样就建立了一条虚拟通信网络,然后再通过相关方法进行通信.项目需在服务端建立一个java程序,客户端建立一个android程序. 二.代码编写 (一) PC端的代码编写--java程序 (1)相关方法 Socket accept() :如果接收到一个来自客户端的socket的连接

AF_UNIX域通信(基于socket和pipe的通信,只适于UNIX系统S&C同在一个主机上,用于进程通信)

服务器端: #include<stdio.h>#include<unistd.h>#include<stdlib.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include <sys/socket.h>#include <sys/un.h>#include <stddef.h>char buf[100];void main

【Socket编程】Java通信是这样炼成的

简介 网络无处不在,移动互联时代也早已到来,单机版程序慢慢的已没有生命力,所有的程序都要能够访问网络,比如 QQ 网络聊天程序.迅雷下载程序等,这些程序都要同网络打交道,本次将与各位小伙伴们分享的就是 Java 中的网络编程—— Socket 通信. 网络基础知识 两台计算机要通过网络进行通信,必须具备如图所示的条件: a.唯一的标识(IP地址): b.需要共同的语言(协议): c.辨别不同应用程序(端口号). 其中的重要概念如下: 1.IP地址 每台计算机的唯一标识,用来区分网络中的不同主机,

Socket套接字通信原理

Tcp/IP协议关系图 Socket在哪里? 原来Socket在这里 Socket是什么呢? Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议. TCP协议 三次握手 四次握手断开 UDP协议 问题 1.为什么握手需要3次,断开需要4次? 2.阻塞和非阻塞的实现原理?

一个 Java 的 Socket 服务器和客户端通信的例子

http://blog.csdn.net/defonds/article/details/7971259 多个客户端对应一个服务端的通信的一个小例子.  服务端和客户端代码: public class Server { /** * 监听的端口 */ public static final int PORT = 12345; public static void main(String[] args) { System.out.println("服务器启动>>>>>&

网络编程 TCP协议:三次握手,四次回收,反馈机制 socket套接字通信 粘包问题与解决方法

TCP协议:三次握手,四次挥手 TCP协议建立双向通道. 三次握手, 建连接: 1:客户端向服务端发送建立连接的请求 2:服务端返回收到请求的信息给客户端,并且发送往客户端建立连接的请求 3:客户端接收到服务端发来的请求,返回接成功给服务端,完成双向连接 第一客戶向服务端发送请求,请求建立连接 服务端同客户端的请求,并同时向客户端发送建立 连接的请求,最后客户端同意后建立 双向连接. C ----> S C <---- S - 反馈机制: 客户端往服务端发送请求,服务端必须返回响应, 告诉客户

socket 套接字通信

一.什么是socket?socket是一个模块, 又称套接字,用来封装 互联网协议(应用层以下的层). 二.为什么要有socket?socket可以实现互联网协议 应用层以下的层 的工作,提高开发效率. 三.怎么使用socket?import socket写socket套接字: ClientServer使用如下:client.py '''启动服务端后再启动客户端'''import socket #1.买手机client = socket.socket() #拿到一个手机对象 #2.拨号clien