本文简述
是否曾经遇到过需要处理各种网络通信需求,却无从下手的情况?今天给大家介绍两个个超强大的Socket网络通信框架,它几乎涵盖了所有需要的通信模块!它的设计非常人性化,可以轻松地构建自己的网络通信应用。无论是初学者还是资深开发者,都能快速上手。
1、TouchSocket
简介
TouchSocket是.Net(包括 C# 、VB.Net、F#)的一个整合性的socket网络通信框架。包含了 tcp、udp、ssl、http、websocket、rpc、jsonrpc、webapi、xmlrpc、modbu等一系列的通信模块。一键式解决 tcp 黏分包问题,使用协议模板,可快速实现「固定包头」、「固定长度」、「区间字符」等一系列的数据报文解析。
支持环境
- o .NET Framework4.5及以上
- o .NET 6.0及以上
- o .NET Standard2.0及以上
支持框架
- o Console
- o WPF
- o Winform
- o Blazor Server
- o Xamarin
- o MAUI
- o Avalonia
- o Mono
- o Unity 3D(除WebGL) 其他(即所有C#系)
功能导图
特点速览
传统IOCP和TouchSocket的IOCP模式
TouchSocket的IOCP和传统也不一样,就以微软官方示例为例,他是使用MemoryBuffer开辟一块内存,均分,然后给每个会话分配一个区接收,等收到数据后,再复制接收的数据,然后把复制的数据进行处理。而TouchSocket是每次接收之前,从内存池拿一个可用内存块,然后直接用于接收,等收到数据以后,直接就把这个内存块抛出处理,这样就避免了复制操作,虽然只是细小的设计,但是在传输10w次64kb的数据时,性能相差了10倍。
数据处理适配器
相信大家都使用过其他的Socket产品,那么TouchSocket在设计时也是借鉴了其他产品的优秀设计理念,数据处理适配器就是其中之一,但和其他产品的设计不同的是,TouchSocket的适配器功能更加强大,易用,且灵活。它不仅可以提前解析数据包,还可以解析数据对象,可以随时替换,然后立即生效。例如:可以使用固定包头对数据进行预处理,从而解决数据分包、粘包的问题。也可以直接解析HTTP数据协议、WebSocket数据协议等。
兼容性与适配
TouchSocket提供多种框架模型,能够完全兼容基于TCP、UDP协议的所有协议。例如:TcpService与TcpClient,其基础功能和Socket一模一样,只是增强了框架的坚固性和并发性,将连接和接收数据通过事件的形式抛出,让使用者能够更加友好的使用。
简单示例
【TcpService】
TcpService service = new TcpService();
service.Connecting = (client, e) => {return EasyTask.CompletedTask; };//有客户端正在连接
service.Connected = (client, e) => {return EasyTask.CompletedTask; };//有客户端连接
service.Disconnected = (client, e) => {return EasyTask.CompletedTask; };//有客户端断开连接
service.Received = (client, e) =>
{
//从客户端收到信息
string mes = e.ByteBlock.ToString();
Console.WriteLine(#34;已从{client.Id}接收到信息:{mes}");
return EasyTask.CompletedTask;
};
service.Start(7789);//启动
【TcpClient】
TcpClient tcpClient = new TcpClient();
tcpClient.Connected = (client, e) => {return EasyTask.CompletedTask; };//成功连接到服务器
tcpClient.Disconnected = (client, e) => {return EasyTask.CompletedTask; };//从服务器断开连接,当连接不成功时不会触发。
tcpClient.Received = (client, e) =>
{
//从服务器收到信息
string mes = Encoding.UTF8.GetString(e.ByteBlock.Buffer, 0, e.ByteBlock.Len);
Console.WriteLine(#34;接收到信息:{mes}");
return EasyTask.CompletedTask;
};
tcpClient.Connect("127.0.0.1:7789");
tcpClient.Send("RRQM");
【TcpClient 断线重连】 在Config的插件配置中,使用重连插件即可。
.ConfigurePlugins(a=>
{
a.UseReconnection(5, true, 1000);
});
【FixedHeaderPackageAdapter包模式】
该适配器主要解决Tcp粘分包问题,数据格式采用简单而高效的“包头+数据体”的模式,其中包头支持:
Byte模式(1+n),一次性最大接收255字节的数据。Ushort模式(2+n),一次最大接收65535字节。Int模式(4+n),一次最大接收2G数据。以上数据头均采用TouchSocketBitConverter的默认端模式(小端模式),使用者可以根据需求切换默认端模式。
TouchSocketBitConverter.DefaultEndianType = EndianType.Little;
【CustomFixedHeaderDataHandlingAdapter】
用户自定义固定包头适配器,主要帮助用户解决具有固定包头的数据帧信息。例如:下列数据格式,仅需要实现几个接口,就能完成解析,详细操作请参照API。
|1|1|1|**********|
【CustomUnfixedHeaderDataHandlingAdapter】
用户自定义不固定包头适配器,主要帮助用户解决具有包头不固定的数据帧信息。例如:最典型的HTTP数据包,其数据头和数据体由“\r\n”隔开,而数据头又因为请求者的请求信息的不同,头部数据也不固定,而数据体的长度,也是由数据头的ContentLength的值显式指定的,所以可以考虑使用CustomUnfixedHeaderDataHandlingAdapter解析,也是仅通过简单的开发,就能实现。
源码地址
https://github.com/RRQM/TouchSocket
2、weaving-socket
简介
weaving-socket以.net core 为基础,设计基于TCP通信的交互框架。是编写物联网,消息队列,websocket应用,移动通信应用,IM等完美的选择。可规范先后台交互处理,可支持,B/C,C/S,手机移动标准化的通信方式。与其他架构区别,除了同意数据接收外,架构自带内置协议,保证数据完整。
- o 支持 Json, Bytes, custom 多种方式,分别代表,内置json协议,内置二进制协议,自定义协议(原始数据)
- o 支持 socket(TCP),websocket,udp
安装下载
- o nuget可搜索包
- o Weave.TCPClient 客户端异步请求包,Weave.TcpSynClient 客户端同步请求包
- o Weave.Server 服务端开发包
- o U3D开发包 nuget Weave.TCPClient
运行步骤
先编写好客户端,与服务器端代码,设置好IP,PROT。然后先运行服务端,在运行客户端。
类说明
服务端类 Weave.Server 包
- o WeaveP2Server socket服务端类库
- o WeaveWebServer wbesocket服务端类库
- o HttpServer HTTP协议类库
- o WeaveUDPServer UDP服务端类库
- o 服务类库中事件包括 weaveReceiveBitEvent - Bytes, custom 类型接收事件 waveReceiveEvent Json 类型接收事件 WeaveReceiveSslEvent ssl 证书加密接收事件 weaveDeleteSocketListEvent 客户端断链事件 weaveUpdateSocketListEvent 客户端连接上线 事件
- o Send(soc,command, data); 服务端发送数据方法
异步客户端类 Weave.TCPClient 包
- o P2Pclient socket客户端端类库
- o WeaveUDPclient UDP客户端端类库
- o 客户类库中事件包括 ReceiveServerEventbit - Bytes, custom 类型接收事件 ReceiveServerEvent Json 类型接收事件 Timeoutevent 客户端断链事件
- o Send()客户端发送数据方法
同步客户端类 Weave.TcpSynClient 包
TcpSynClient 同步客户端类库,只有收到服务端返回响应才算完成请求。
服务端代码示例
服务端:
创建一个控制台程序,引用类库 using Weave.Base; using Weave.Server;
然后编写代码
static void Main(string[] args)
{
WeaveP2Server server = new WeaveP2Server(WeaveDataTypeEnum.Bytes);//初始化类库
server.receiveevent += Server_receiveevent;//注册接收事件
//当然还有很多其他的事件可以注册,比如新增连接事件,连接断开事件
server.start(8989);//启动监听8989端口
Console.WriteLine("8989listen:");
Console.ReadKey();
}
private static void Server_receiveevent(byte command, string data, System.Net.Sockets.Socket soc)
{
Console.WriteLine(data);//输出客户端发来的信息
}
WEBSOCKT服务端代码示例
将服务端 代码中 WeaveP2Server 类 替换成 WeaveWebServer类
UDP服务端代码示例
将服务端 代码中 WeaveP2Server 类 替换成 WeaveUDPServer类
客户代码示例
异步请求客户端:
创建一个控制台程序,引用类库 using Weave.TCPClient; using Weave.Base; 然后编写代码
P2Pclient client = new P2Pclient(DataType.bytes);//初始化类库
static void Main(string[] args)
{
client.timeoutevent += Client_timeoutevent;//注册连接超时事件
client.receiveServerEvent += Client_receiveServerEvent;//注册接收事件
client.start("127.0.0.1", 8989, false);//启动连接127.0.0.1服务器的8989端口。不需要服务器TOKEN
System.Threading.Thread.Sleep(1000);
Console.WriteLine("server link OK:");
client.send(0x1, "test2017-5-5");//给服务器发送信息,参数1,0x01指令,指令可以设置0-254,其中0x9c与0xff,是保留指令不能使用。参数2:发送string类型的数据。
Console.WriteLine("send:test2017-5-5");
Console.ReadKey();
}
private static void Client_receiveServerEvent(byte command, string text)
{
//command是从服务器发来的指令
//text是从服务器发来的数据
}
private static void Client_timeoutevent()
{
//连接超时或断线会启动此事件
client。Restart(false);//重新连接
}
同步请求客户端:
nuegt Weave.TcpSynClient
Weave.Client.TcpSynClient tcpSynClient = new TcpSynClient(Weave.Client.DataType.bytes, "127.0.0.1", 9903);
tcpSynClient.Start();
tcpSynClient.Send(0x01, "asdasd");//发送请求
while(true)
var commdata = tcpSynClient.Receives(null);//等待回执
websocket客户端:
html 中引用 websocket 客户端JS
socket = new UDCsocket({
//115.28.26.204
ip: 'ws://127.0.0.1', port: 11001, conn: function () {
// socket.settakon("123123");
alert("连接成功");
//socket.SendData(1, "login", "123123ssdfsdf", "");
}
, recData: function (text) {
//$('#test').html("");
$('#test').append("收到:" + text + '<br/> ')//这个意思你们都懂了把
}
, close: function () { alert("连接关闭"); }
, error: function (msg) { alert("连接错误" + msg); }
, jump: function (ip) { alert("服务器超过最大连接,请连接其他服务器:" + ip); }
});
socket.SendData(0x02, "GetLISTimei", '', ""); //发送内容
源码地址
https://github.com/dreamsfly900/weaving-socket
版权声明:本文来源于网络素材收集整理或网友供稿,版权归版权所有者所有,如有侵权请联系小编予以删除