这两个Socket网络通信框架太强大


本文简述

是否曾经遇到过需要处理各种网络通信需求,却无从下手的情况?今天给大家介绍两个个超强大的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


版权声明:本文来源于网络素材收集整理或网友供稿,版权归版权所有者所有,如有侵权请联系小编予以删除

原文链接:,转发请注明来源!