首页 > 其他分享 >超轻量级、支持插件的 .NET 网络通信框架

超轻量级、支持插件的 .NET 网络通信框架

时间:2024-09-09 10:53:12浏览次数:12  
标签:tcpClient 插件 TouchSocket client CompletedTask NET 轻量级 客户端

前言

给大家推荐一个轻量级的、支持插件的综合网络通信库:TouchSocket。

TouchSocket 的基础通信功能包括 TCP、UDP、SSL、RPC 和 HTTP。其中,HTTP 服务器支持 WebSocket、静态网页、XML-RPC、WebAPI 和 JSON-RPC 等扩展插件。

此外,TouchSocket 还支持自定义协议的 TouchRPC,具备 SSL 加密、异步调用、权限管理、错误状态返回、服务回调和分布式调用等功能。

在空载函数执行时,10 万次调用仅需 3.8 秒;在不返回状态时,仅需 0.9 秒。

项目介绍

TouchSocket(Pro)是基于 .NET 的程序集系列,可用于对应 .NET 版本的 C#、F# 和 VB.NET 项目。无论你的项目是控制台、WinForms、WPF 还是 ASP.NET Core,它都全面支持。

TouchSocket(Pro)长期支持 .NET 4.5、.NET 4.8.1、.NET Standard 2.0 三个平台,并将 .NET 6.0 作为最新稳定版支持平台,同时支持.NET 7.0 作为最新发布平台。

项目环境

.NET 4.5:保证了在.Net Framework上的最低支持版本。基本上支持全系99%的功能。

.NET 4.8.1:这是在net45的依赖基础之上,额外添加了一些微软官方库,以支持达到net6.0一样的功能(例如:Span、ValueTuple、ValueTask等)。

.NET Standard 2.0:这是保证了在一些通用平台上的最低依赖。基本上支持全系99%的功能。

.NET 6.0:这是目前最新的稳定版发布平台,它在最低依赖的前提下,还保证了全部功能。

.NET 7.0:这是目前最新的发布平台,我们会在该平台上开发最能尝鲜的功能(例如:AOT等)。

支持框架的框架Console、WPF、Winform、Blazor Server、Xamarin、MAUI、Avalonia、Mono、Unity 3D(除WebGL)、其他(即所有C#系)

项目功能

1、功能导图

 

2、项目文档

项目特点

1、传统 IOCP 与 TouchSocket 的 IOCP 模式

TouchSocket 的 IOCP 模式与传统 IOCP 不同。以微软官方示例为例,传统 IOCP 使用 MemoryBuffer 开辟一块内存,均分后给每个会话分配一个区域接收数据,收到数据后再复制并处理。而 TouchSocket 则在每次接收前从内存池中获取一个可用内存块直接用于接收,收到数据后直接处理该内存块,从而避免了复制操作。虽然这只是细节上的设计差异,但在传输 10 万次 64KB 数据时,性能提升了 10 倍。

2、数据处理适配器

TouchSocket 在设计时借鉴了其他产品的优秀理念,数据处理适配器就是其中之一。与其他产品不同的是,TouchSocket 的适配器功能更加强大、易用且灵活。它不仅可以提前解析数据包,还可以解析数据对象,并且可以随时替换,立即生效。例如,可以使用固定包头对数据进行预处理,从而解决数据分包和粘包问题;也可以直接解析 HTTP 数据协议和 WebSocket 数据协议等。

3、兼容性与适配

TouchSocket 提供多种框架模型,能够完全兼容基于 TCP 和 UDP 协议的所有协议。例如,TcpService 和 TcpClient 的基础功能与 Socket 相同,但增强了框架的坚固性和并发性,通过事件形式抛出连接和接收数据,使用户能够更加友好地使用。

项目使用

1、Nuget安装

搜索框输入TouchSocket,然后在搜索结果中选择,点击安装,具体如下图所示

2、TcpService

TcpService是Tcp系服务器基类,它不参与实际的数据交互,只是配置、激活、管理、注销、重建SocketClient类实例。

而SocketClient是当TcpClient(客户端) 成功连接服务器以后,由服务器新建的一个实例类,后续的所有通信,也都是通过该实例完成的。

var service = new TcpService();
service.Connecting = (client, e) => { return EasyTask.CompletedTask; };//有客户端正在连接
service.Connected = (client, e) => { return EasyTask.CompletedTask; };//有客户端成功连接
service.Disconnecting = (client, e) => { return EasyTask.CompletedTask; };//有客户端正在断开连接,只有当主动断开时才有效。
service.Disconnected = (client, e) => { return EasyTask.CompletedTask; };//有客户端断开连接
service.Received = (client, e) =>
{
    //从客户端收到信息
    var mes = Encoding.UTF8.GetString(e.ByteBlock.Buffer, 0, e.ByteBlock.Len);//注意:数据长度是byteBlock.Len
    client.Logger.Info($"已从{client.Id}接收到信息:{mes}");
​
    client.Send(mes);//将收到的信息直接返回给发送方
​
    //client.Send("id",mes);//将收到的信息返回给特定ID的客户端
​
    //将收到的信息返回给在线的所有客户端。
    //注意:这里只是一个建议思路,实际上群发应该使用生产者消费者模式设计
    //var ids = service.GetIds();
    //foreach (var clientId in ids)
    //{
    //    if (clientId != client.Id)//不给自己发
    //    {
    //        service.Send(clientId, mes);
    //    }
    //}
​
    return EasyTask.CompletedTask;
};
​
service.Setup(new TouchSocketConfig()//载入配置
    .SetListenIPHosts("tcp://127.0.0.1:7789", 7790)//同时监听两个地址
    .ConfigureContainer(a =>//容器的配置顺序应该在最前面
    {
        a.AddConsoleLogger();//添加一个控制台日志注入(注意:在maui中控制台日志不可用)
    })
    .ConfigurePlugins(a =>
    {
        //a.Add();//此处可以添加插件
    }));
​
service.Start();//启动

3、TcpClient

TcpClient是Tcp系客户端基类,他直接参与tcp的连接、发送、接收、处理、断开等,他的业务与服务器的SocketClient是一一对应的。
var tcpClient = new TcpClient();
tcpClient.Connecting = (client, e) => { return EasyTask.CompletedTask; };//即将连接到服务器,此时已经创建socket,但是还未建立tcp
tcpClient.Connected = (client, e) => {return EasyTask.CompletedTask; };//成功连接到服务器
tcpClient.Disconnecting = (client, e) => {return EasyTask.CompletedTask; };//即将从服务器断开连接。此处仅主动断开才有效。
tcpClient.Disconnected = (client, e) => {return EasyTask.CompletedTask; };//从服务器断开连接,当连接不成功时不会触发。
tcpClient.Received = (client, e) =>
{
    //从服务器收到信息。但是一般byteBlock和requestInfo会根据适配器呈现不同的值。
    var mes = Encoding.UTF8.GetString(e.ByteBlock.Buffer, 0, e.ByteBlock.Len);
    tcpClient.Logger.Info($"客户端接收到信息:{mes}");
    return EasyTask.CompletedTask;
};
​
//载入配置
tcpClient.Setup(new TouchSocketConfig()
    .SetRemoteIPHost("127.0.0.1:7789")
    .ConfigureContainer(a =>
    {
        a.AddConsoleLogger();//添加一个日志注入
    }));
​
tcpClient.Connect();//调用连接,当连接不成功时,会抛出异常。
​
//Result result = tcpClient.TryConnect();//或者可以调用TryConnect
//if (result.IsSuccess())
//{
​
//}
​
tcpClient.Logger.Info("客户端成功连接");
​
tcpClient.Send("RRQM");

4、TcpClient 断线重连

在Config的插件配置中,使用重连插件即可。

.ConfigurePlugins(a=> 
{
   a.UseReconnection(5, true, 1000);//如需永远尝试连接,tryCount设置为-1即可。
});

项目案例

1、工程师软件工具箱

使用TouchRpc开发的一个内部工程师软件工具箱 。

2、远程监控、控制项目

项目地址

GitHub:https://github.com/RRQM/TouchSocket

Gitee:https://gitee.com/RRQM_Home/TouchSocket

文档地址:https://touchsocket.net/

最后

如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。

也可以加入微信公众号[DotNet技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!优秀是一种习惯,欢迎大家留言学习!

标签:tcpClient,插件,TouchSocket,client,CompletedTask,NET,轻量级,客户端
From: https://www.cnblogs.com/1312mn/p/18401867

相关文章

  • Kubernetes Pod四种常见调度策略详解
    在Kubernetes(k8s)的世界里,Pod是最基本的部署单元,它可能包含一个或多个容器。如何将这些Pod调度到集群中的适当节点上,是一个至关重要的问题。Kubernetes提供了多种调度策略,以确保Pods能够高效、稳定地运行。本文将详细介绍四种常见的KubernetesPod调度方式。1.默认调度默认调度......
  • Android平台轻量级RTSP服务之GStreamer还是SmartRtspServer
    技术背景Android上启动一个轻量级RTSP服务,让Android终端像网络摄像头一样提供个外部可供RTSP拉流的服务,在内网小并发又不希望部署单独流媒体服务的场景下非常适用,在Android终端实现这样的流媒体服务,决定了,只能是轻量级的服务。可以通过集成第三方库或编写自定义的RTSP服务器代码来......
  • Kubernetes Pod的常见调度方式
    Kubernetes中的Pod调度是将Pod分配到合适节点的过程。调度器负责这一过程,并有多种调度方式和策略,以下是一些常见的调度方式:1.默认调度(DefaultScheduling)功能:Kubernetes的默认调度器(kube-scheduler)会根据一系列内置的调度策略自动选择适合的节点。考虑因素:它会考虑节点......
  • kubernetes Ingress原理
    KubernetesIngress是一种用于管理外部访问Kubernetes服务的API资源,主要用于HTTP和HTTPS流量的路由。Ingress通过提供一个统一的入口点来简化外部流量的管理。以下是Ingress的基本原理和工作机制:1.Ingress资源定义:Ingress是Kubernetes中的一种资源对象,定义了......
  • Kubernetes各模块如何与API Server通信
    Kubernetes的架构是基于一系列的组件和模块,这些组件通过APIServer进行通信。APIServer是Kubernetes控制平面的核心,负责处理所有的RESTfulAPI请求,并与etcd(用于存储集群状态)进行交互。以下是Kubernetes各个主要模块如何与APIServer通信的详细说明:1.Kubelet功能......
  • Nature Genetics | Rajeev K. Varshney综述:解锁植物遗传学的端粒到端粒(T2T)基因组组装
    近期,RajeevK.Varshney团队在Naturegenetics发表综述文章:Unlockingplantgeneticswithtelomere-to-telomeregenomeassemblies。摘要连续基因组序列组装将帮助我们实现作物转化基因组学的全面潜力。最近在测序技术方面的进步,尤其是长读长测序策略,使得构建无间隙的端粒到......
  • Git Extensions:一个.NET开源的 Git 图形用户界面(GUI)工具
    前言今天大姚给大家分享一个.NET开源、免费的用于管理Git存储库的独立图形用户界面(GUI)工具,它还与Windows资源管理器和MicrosoftVisualStudio(2015/2017/2019/2022)集成:GitExtensions。Git新手指南:从基础到实践的全方位教程功能介绍图形用户界面:提供一个友好的......
  • 【Kubernetes】K8s 的鉴权管理(一):基于角色的访问控制(RBAC 鉴权)
    K8s的鉴权管理(一):基于角色的访问控制(RBAC鉴权)1.Kubernetes的鉴权管理1.1审查客户端请求的属性1.2确定请求的操作2.基于角色的访问控制(RBAC鉴权)2.1基于角色的访问控制中的概念2.1.1角色2.1.2角色绑定2.1.3主体2.2实现基于角色的访问控制1.Kuber......
  • 虚拟机安装Ubuntu16并安装Ros(Kinetic)
    1.虚拟机安装镜像教程参考:https://www.cnblogs.com/su1961117443/p/12419892.html或者https://www.bilibili.com/video/BV1zt411G7Vn?p=2可以安装vmtools,界面显示窗口自适应。2.ROS各个版本注:因为ubuntu是16.04的,所以这里我们安装Kinetic版本的ROS.参考链接:https://blog.csdn.ne......
  • Chrome下载视频的插件
      大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学......