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

news2024/9/20 6:10:45

目录

前言

项目介绍

项目环境

项目功能

1、功能导图

2、项目文档

项目特点

1、传统 IOCP 与 TouchSocket 的 IOCP 模式

2、数据处理适配器

3、兼容性与适配

项目使用

1、Nuget安装

2、TcpService

3、TcpClient

4、TcpClient 断线重连

项目案例

1、工程师软件工具箱

2、远程监控、控制项目

项目地址


前言

给大家推荐一个轻量级的、支持插件的综合网络通信库: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开发的一个内部工程师软件工具箱 。

img

img

img

2、远程监控、控制项目

img

img

项目地址

GitHub:GitHub - RRQM/TouchSocket: TouchSocket is an integrated .NET networking framework that includes modules for socket, TCP, UDP, SSL, named pipes, HTTP, WebSocket, RPC, and more. It offers a one-stop solution for TCP packet issues and enables quick implementation of custom data message parsing using protocol templates.

Gitee:TouchSocket: TouchSocket是.Net(包括 C# 、VB.Net、F#)的一个整合性的网络通信框架。包含了socket、 tcp、udp、ssl、namedPipe、http、websocket、rpc、jsonrpc、webapi、xmlrpc、modbus等一系列的通信模块。一键式解决 tcp 黏分包问题,使用协议模板,可快速实现「固定包头」、「固定长度」、「区间字符」等一系列的数据报文解析。

文档地址:TouchSocket说明文档。 TouchSocket | TouchSocket

最后

如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。也可以加入微信公众号 [DotNet技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!优秀是一种习惯,欢迎大家留言学习!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2118644.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

elementUI之不会用

form表单注意事项 <template><div class"container"><el-form :model"form" label-width"80px" :rules"RulesName" ref"loginForm"><el-form-item label"姓名" prop"username">…

【阿雄不会写代码】全国职业院校技能大赛GZ036第九套

也不说那么多了&#xff0c;要用到这篇博客&#xff0c;肯定也知道他是干嘛的&#xff0c;给博主点点关注点点赞&#xff01;&#xff01;&#xff01;这样博主才能更新更多免费的教程&#xff0c;不然就直接丢付费专栏里了&#xff0c;需要相关文件请私聊

软件测试外包公司分享:软件产品鉴定测试内容和作用

软件产品鉴定测试是指对软件在不同阶段进行系统性、全面性的检测与评估&#xff0c;确保产品在功能、安全性、性能等方面达到既定标准。这对企业选择、验证及应用软件产品至关重要。 软件产品鉴定测试的内容主要包括以下几项&#xff1a;   1、功能测试&#xff1a;验证软件…

Sumsub 获评 Gartner® “新兴技术:针对在线欺诈预防的 GenAI 安全服务”代表性供应商

AI 为业务增长提供了巨大机遇。但也带来了重大威胁&#xff0c;比如可能会导致企业蒙受数百万美元损失的深度伪造攻击。 近日&#xff0c;全球领先的验证平台 Sumsub 被权威机构 Gartner 列入《新兴技术&#xff1a;针对在线欺诈预防的 GenAI 安全服务》报告的代表性供应商名单…

十二、C语言:内存函数

一、memcpy 1.1 使用 void * memcpy ( void * destination, const void * source, size_t num ); 1.前两个参数类型都是void*&#xff0c;因此可以拷贝任何数据类型&#xff1b; 2.num参数为要拷贝的字节数&#xff1b; int main() {char arr[10] "abcdef";char b…

第三届828 B2B企业节开幕,大腾智能携手华为云共谱数字化新篇章

8月27日&#xff0c;由华为携手上万家伙伴共同发起的第三届828 B2B企业节在贵州正式开幕。 本届企业节推出上万款数智产品&#xff0c;600多个精选解决方案&#xff0c;旨在融通数智供需&#xff0c;加速企业智改数转&#xff0c;助推中国数智产业实力再升级。中共贵州省委副书…

英文外链代发服务靠谱吗?

英文外链代发服务的可靠性因供应商和服务类型而异。外链代发服务的主要目标是提高网站在搜索引擎中的排名&#xff0c;通过增加指向目标网站的链接数量和质量来实现。然而&#xff0c;并不是所有的外链代发服务都是可靠的&#xff0c;很多外链都是只管发&#xff0c;但是发了有…

你真的理解 Kubernetes 中的 requests 和 limits 吗?

你真的理解 Kubernetes 中的 requests 和 limits 吗&#xff1f; https://www.cnblogs.com/kubesphere/p/14632890.htmlhttps://www.cnblogs.com/kubesphere/p/14632890.html在 Kubernetes 集群中部署资源的时候&#xff0c;你是否经常遇到以下情形&#xff1a; 经常在 Kubern…

客户案例 | 使用 BigQuery 和 AutoML 消除电视行业的数据孤岛和分散

在这个客户案例中&#xff0c;我们会介绍一家大众媒体公司如何利用 BigQuery 和 AutoML 消除数据孤岛和分散。通过参考真实的 Google Cloud 案例研究&#xff0c;我们总结了 Google Cloud 的服务和产品如何使客户的业务受益。 Cloud Ace - 谷歌云 | 谷歌云全球战略合作伙伴 | …

《花100块做个摸鱼小网站! 》第六篇—将小网站部署到云服务器上

⭐️基础链接导航⭐️ 服务器 → ☁️ 阿里云活动地址 看样例 → &#x1f41f; 摸鱼小网站地址 学代码 → &#x1f4bb; 源码库地址 一、前言 到这一篇我们终于把环境搭好&#xff0c;也做好了几个热搜小组件&#xff0c;为了让我们方便展示成果或者方便自己摸鱼&#xff0c…

【CSS in Depth 2 精译_026】4.4 Flexbox 元素对齐、间距等细节处理(上)

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一章 层叠、优先级与继承&#xff08;已完结&#xff09; 1.1 层叠1.2 继承1.3 特殊值1.4 简写属性1.5 CSS 渐进式增强技术1.6 本章小结 第二章 相对单位&#xff08;已完结&#xff09; 2.1 相对…

HTML深度探索 :img应用与实践

HTML深度探索 &#xff1a;img应用与实践 1、定义和用法2、图像格式3、常用属性4、预加载和懒加载4.1 预加载4.2 懒加载 1、定义和用法 HTML 元素 <img>将一张图像嵌入文档。 从技术上讲&#xff0c;实际上并没有将图像插入到网页中&#xff0c;而是将图像链接到了网页。…

17种最佳的联盟营销工具,助你赚取更多佣金

通过最新、最先进的工具获得竞争优势&#xff0c;并启动你的联盟营销策略&#xff0c;以提高效率和节省&#xff08;大量&#xff09;时间。 如果你销售联盟产品或服务&#xff0c;你可能知道&#xff0c;当你意识到市场营销涉及大量工作&#xff08;有时还包括金钱&#xff0…

【算法思想·二叉树】后续篇

本文参考labuladong算法笔记[二叉树心法&#xff08;后序篇 | labuladong 的算法笔记] 前序位置的代码只能从函数参数中获取父节点传递来的数据&#xff0c;而后序位置的代码不仅可以获取参数数据&#xff0c;还可以获取到子树通过函数返回值传递回来的数据。 那么换句话说&am…

软件设计师备考——计算机系统

学习内容源自「软件设计师」 上午题 #1 计算机系统_哔哩哔哩_bilibili 目录 1.1.1 计算机系统硬件基本组成 1.1.2 中央处理单元 1.CPU 的功能 1)运算器 2)控制器 RISC && CISC 流水线控制 存储器 Cache 中断 输入输出IO控制方式 程序查询方式 中断驱动方…

在python里把图变成gif

import scipy.io import matplotlib.pyplot as plt import imageio import numpy as npdata scipy.io.loadmat("/文件路径/Sol.mat")# 提取数据 t_current data[t].flatten() XX, YY np.meshgrid(data[x].flatten(), data[y].flatten()) u_pred_plot_final data[…

轻松应对:环保专包二级资质续期常见问题解答

在环保专包二级资质续期过程中&#xff0c;企业可能会遇到一系列常见问题。以下是对这些问题的详细解答&#xff0c;旨在帮助企业轻松应对续期挑战&#xff1a; 一、政策理解与把握 问题&#xff1a;如何准确理解和把握最新的环保政策和资质续期要求&#xff1f; 解答&#x…

HCIA--实验十三:VLAN间通信子接口实验/双单臂路由实验

一、实验内容 1.需求/要求&#xff1a; 将两个单臂路由通过两台交换机连接起来&#xff0c;成为双臂路由&#xff0c;并探讨这么做的原因。实现全网通&#xff0c;让任何一台主机之间都可以通信。 二、实验过程 1.拓扑图&#xff1a; 2.步骤&#xff1a; 1.给PC配置ip地址…

传感器技术在构建实时监控系统中有什么作用

在无线传感器技术中&#xff0c;物联网生成的传感器数据通过无线方式传输到网络服务器&#xff0c;工程师可以在其中跟踪参数。远距离无线通信提高了工业 4.0 的成本效率并减少了人力。实时监控系统旨在显示传感器节点周围的快速变化&#xff0c;这需要快速、低延迟的数据传输。…

数据分析与挖掘课程相关资源

这是在gitee上整的关于这门课的一个开源项目。 https://gitee.com/rainpet/python-data-analysis-and-mining-demo 头歌平台。 常见问题&#xff1a; 1、如何确认conda的版本&#xff0c;执行如下命令&#xff1a; conda list anaconda$2、实验室登陆后&#xff0c;无法上网&a…