开始使用Dotnetty高性能网络库进行网络通讯

news2024/11/16 7:40:14
  • 📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!
  • 📢本文作者:由webmote 原创
  • 📢作者格言:新的征程,我们面对的不是技术而是人心,人心不可测,海水不可量,唯有技术,才是深沉黑夜中的一座闪烁的灯塔 !

1 介绍

在这里插入图片描述
(先抱怨Microsoft)我们做NET开发,我们很羡慕JAVA能有NETTY、SPRING、STRUTS、DUBBO等优秀的框架,而我们的NET只需要盯着看,嘿嘿,之前生态做得不好,恨铁不钢。然而,由于最近发布的Net Core,它慢慢拉回了属于Microsoft的一小部分世界。

DotNetty是由Azure团队建模的(几乎可以说)JAVA Netty(目前Netty的一部分已经实现),目前Github上的Star有1.8K+,地址:https://github.com/Azure/DotNetty,没有任何文档,代码中还有一些注释。虽然比 Netty 问世晚了很多年,但我们 NET 程序员也应该庆幸他们终于可以在自己的平台上使用像 Netty 这样强大的通信框架。

首先,让我们来认识一下这位大明星——dotnetty。它是.NET平台上的明星网络库,堪比好莱坞明星,颜值高、性能强、可靠性极高。如果你需要在.NET平台上进行高性能、高可靠性、高可扩展性的网络通信,那么就不能错过它啦!

2. 如何开始使用

传统通信的问题:
我们使用通用的应用程序或库相互通信。例如,我们经常使用 HTTP 客户端库从 Web 服务器获取信息,或通过 Web 服务执行远程调用。

但是,有时通用协议或其实现不能很好地满足需求。例如,我们不能使用通用的 HTTP 服务器来处理大型文件、电子邮件和近乎实时的消息,例如财务信息和多人游戏数据。我们需要一个高度优化的协议来处理一些特殊场景。例如,您可能希望实现优化的 Ajax 聊天应用程序、媒体流或大文件传输。您甚至可以设计和实施一个全新的协议来准确满足您的需求。

另一种不可避免的情况是,当您必须处理遗留的专有协议以确保与旧系统的互操作性时。在这种情况下,重要的是我们如何在不牺牲应用程序的稳定性和性能的情况下快速实现协议。

Netty是一个提供异步事件驱动(asynchronous event-driven)的网络应用程序框架,是用于快速开发高性能、可扩展协议的服务器和客户端。

换句话说,Netty是一个NIO客户端-服务器框架,它可以用来快速轻松地开发网络应用程序,例如服务器和客户端协议。Netty大大简化了网络程序的开发过程,例如TCP和UDP套接字服务的开发。

“快速简单”并不意味着应用程序将难以维护和低性能,Netty是一个精心设计的框架,它从FTP、SMTP、HTTP等许多协议的实现中吸取了大量经验,许多二进制和传统的基于文本的协议。因此,Netty成功地找到了一种方法,既可以在不损失灵活性的情况下实现开发的简单性,高性能和稳定性。

转回正题,
第一步,我们需要引用dotnetty库。这就像把这位大明星请到自己家里开Party,需要提前准备好他的资料,让他可以尽情展示自己的魅力。
在这里插入图片描述
DotNetty.Buffers:内存缓冲区管理的封装。
DotNetty.Codecs:编码和解码被封装,包括一些基本基类的实现。项目中的自定义协议必须继承项目的特定基类和实现。
DotNetty.Codecs.Mqtt:MQTT(Message Queue Telemetry Transmission)编解码器被封装,包括一些基本基类的实现。
DotNetty.Codecs.Protobuf:Protobuf编解码器被封装,包括一些基本基类的实现。
DotNetty.Codecs.ProtocolBuffers:ProtocolBuffers编解码器被封装,包括一些基本基类的实现。
DotNetty.Codecs.Redis:Redis协议编解码器被封装,包括一些基本基类的实现。
DotNetty.Common:公共类库项目、打包线程池、并行任务和公共帮助类封装。
DotNetty.Handlers:封装常用的流水线处理器,如TLS编解码器、超时机制、心跳检查、日志等。
DotNetty.Transport:DotNetty核心实现,Socket基础框架,通信方式:异步非阻塞。
DotNetty.Transport.Libuv:DotNetty基于Libuv(高性能,事件驱动的I / O库)实现了自己的核心实现。
常用的库有编解码器、通用库、处理程序库、缓冲区库、传输库。目前,Azure 团队正在实现其他 Netty API(包括非公共 Netty API)。让我们拭目以待。

第二步,我们需要
编写服务器端代码。服务器端就像是Party的主人,负责接待来宾,并提供最棒的服务。我们可以通过以下代码片段来创建一个最简单的服务器:

class Program
{
    static void Main(string[] args)
    {
        var bossGroup = new MultithreadEventLoopGroup(1);
        var workerGroup = new MultithreadEventLoopGroup();
        
        try 
        {
            var bootstrap = new ServerBootstrap()
                .Group(bossGroup, workerGroup)
                .Channel<TcpServerSocketChannel>()
                .Option(ChannelOption.SoBacklog, 100)
                .ChildHandler(new ActionChannelInitializer<ISocketChannel>(channel =>
                {
                    IChannelPipeline pipeline = channel.Pipeline;
                    pipeline.AddLast(new LoggingHandler());
                    pipeline.AddLast(new EchoServerHandler());
                }));

            IChannel boundChannel = await bootstrap.BindAsync(IPAddress.Any, 8080);

            Console.ReadLine();

            await boundChannel.CloseAsync();
        }
        finally
        {
            await Task.WhenAll(
                bossGroup.ShutdownGracefullyAsync(TimeSpan.FromMilliseconds(100), TimeSpan.FromSeconds(1)),
                workerGroup.ShutdownGracefullyAsync(TimeSpan.FromMilliseconds(100), TimeSpan.FromSeconds(1)));
        }
    }
}

哇塞,这个服务器简直就是Party的主人公啊!它监听本机IP地址的8080端口,并且通过以下代码,反射出来所有从客户端发来的信息:

pipeline.AddLast(new EchoServerHandler());

3.客户端代码

我们需要编写客户端代码。客户端就像是Party中的嘉宾,需要与主人进行愉快的交流,并互相分享自己的观点。我们可以通过以下代码片段来创建一个最简单的客户端:

class Program
{
    static async Task Main(string[] args)
    {
        var group = new MultithreadEventLoopGroup();

        try
        {
            var bootstrap = new Bootstrap()
                .Group(group)
                .Channel<TcpSocketChannel>()
                .Option(ChannelOption.TcpNodelay, true)
                .Handler(new ActionChannelInitializer<ISocketChannel>(channel =>
                {
                    IChannelPipeline pipeline = channel.Pipeline;
                    pipeline.AddLast(new LoggingHandler());
                    pipeline.AddLast(new EchoClientHandler());
                }));

            IChannel clientChannel = await bootstrap.ConnectAsync(IPAddress.Loopback, 8080);

            Console.ReadLine();

            await clientChannel.CloseAsync();
        }
        finally
        {
            await group.ShutdownGracefullyAsync(TimeSpan.FromMilliseconds(100), TimeSpan.FromSeconds(1));
        }
    }
}

这个客户端会向本机IP地址的8080端口发送一个消息,并且将服务器返回的信息打印出来。就像是Party中的嘉宾,需要与主人进行愉快的交流,并互相分享自己的观点。

结语

好了,现在我们已经学会了如何使用dotnetty网络库啦!相信大家对这位.NET平台上的明星网络库有了更深入的了解。如果你想让自己的Party变得更加精彩,就一定要请上dotnetty这位大明星啊!

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

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

相关文章

深度:激光和光纤诞生记

光子盒研究院出品 导读&#xff1a;20世纪50年代以来&#xff0c;科技领域掀起了一场光学革命&#xff0c;激光和光纤的诞生&#xff0c;带来了革命性突破。事实上&#xff0c;激光和光纤的诞生也是第一次量子革命的范畴&#xff0c;因为这些技术的发展是基于对量子规律的观测和…

Java集合之LinkedList详解

Java集合之LinkedList 一、LinkedList类的继承关系1. 基类功能说明1.1. Iterator&#xff1a;提供了一种方便、安全、高效的遍历方式。1.2. Collection&#xff1a;为了使ArrayList具有集合的基本特性和操作。1.3. Queue: LinkedList是一种队列&#xff08;Queue&#xff09;数…

I/O error on POST request for “...“ PKIX path building failed的解决办法

异常&#xff1a; 项目中需要用RestTemplate调三方接口&#xff0c;url是https开头加密的。postman可以调通&#xff0c;代码提示没有证书&#xff0c;具体如下&#xff1a; [ERROR][2023-06-25 10:41:16,574][com.peraglobal.restInterface.controller.PLMController]I/O err…

MySQL如何在Centos7环境安装:简易指南

目录 前言 一、卸载不要的环境 1.检查本地MySQL是否正在运行 2.停止正在运行的MySQL 二、检查系统安装包 三、卸载这些默认安装包 1.手动一个一个卸载 2.自动卸载全部 四、获取mysql官方yum源 五、安装mysql yum源&#xff0c;对比前后yum源 1.安装前 2.安装中 3.…

MySQL进阶SQL语句之函数运用

目录 1.select&#xff08;显示表格中一个或数个字段的所有数据记录&#xff09; 2.distinct&#xff08;不显示重复的数据记录&#xff09; 3.where&#xff08;有条件查询&#xff09; 4.and 、or&#xff08;且、或&#xff09; 5. in&#xff08;显示已知的值的数据记…

浅谈单线程和多线程的异同

前两天有个面试&#xff0c;面试官问了我一个单线程和多线程的问题&#xff0c;情境如下&#xff1a; 面试官&#xff1a;你对单线程和多线程有什么看法&#xff1f; 我&#xff1a; 面试官&#xff1a; 我&#xff1a; 面试官&#xff1a; 我 现在先让我们来了解一下进程…

WS协议—介绍及原理

举例来说&#xff0c;我们想了解今天的天气&#xff0c;只能是客户端向服务器发出请求&#xff0c;服务器返回查询结果。HTTP 协议做不到服务器主动向客户端推送信息。 WebSocket 协议在2008年诞生&#xff0c;2011年成为国际标准。所有浏览器都已经支持了。它的最大特点就是&…

ms17_010(永恒之蓝)漏洞复现详细教程

如题&#xff0c;这是个漏洞复现的详细教程&#xff0c;本教程针对的系统是Windows7操作系统&#xff0c;其他系统请自行测试。 备注&#xff1a;教程会很详细&#xff0c;讲解会很明白&#xff0c;一文可以解决你的常见困难。 测试环境 kalilinux 192.168.1.109 &#xff08;…

Java设计模式之结构型-装饰器模式(UML类图+案例分析)

目录 一、基本概念 二、角色设计 三、代码实现 案例一 案例二 四、总结 一、基本概念 装饰器模式是指不必在改变原有的类和不使用继承的情况下&#xff0c;动态扩展一个对象的功能。 二、角色设计 角色描述抽象构件是一个接口或者抽象类&#xff0c;定义我们最核心的…

科技云报道:边缘计算步入“黄金年代”

科技云报道原创。 当前时点&#xff0c;AI大模型已经站在了从“玩具”向“工具”快速演化的关键迭代期。如何让大模型渗透进入各类垂直场景&#xff0c;如何更低成本的使用大模型&#xff0c;如何让更多场景与用户接触AI&#xff0c;成为了发展的下一个重点。 在AI向实际场景…

大数据应用——总结与反思

1.谈谈你对大数据行业的认识&#xff0c;目前对应的大数据岗位有哪些&#xff1f;每种岗位需要掌握哪些技能水平&#xff1f;目前自己的差距在哪里&#xff1f; &#xff08;1&#xff09;概述 对于大数据行业的认识&#xff0c;我的理解是&#xff0c;大数据是指海量数据&…

8种常见的SQL错误用法

前言&#xff1a;MySQL在2016年仍然保持强劲的数据库流行度增长趋势。越来越多的客户将自己的应用建立在MySQL数据库之上&#xff0c;甚至是从Oracle迁移到MySQL上来。但也存在部分客户在使用MySQL数据库的过程中遇到一些比如响应时间慢&#xff0c;CPU打满等情况。现将《Apsar…

Dumuz同步微信通讯录及常见问题

在Dumuz工具中&#xff0c;【微信通讯录同步】主要功能是从当前登录的微信上下载通讯录相关成员数据。 第1步&#xff1a; 打开应用【微信-消息批量发送】&#xff0c;在工具栏中点击【微信通讯录】如下图所示&#xff1a; 第2步&#xff1a; 进入【微信通讯录】 对话框&#…

【AUTOSAR】AUTOSAR开发工具链(九)----基于BTC的MIL/SIL测试操作说明(1)

一、BTC使用注意事项 1、安装成功后&#xff0c;在Edit->Preference->General->Compiler可以找到编辑器MSVC140 启动BTC&#xff1a;插入电子狗、选择与电子狗相匹配的License、选择相应的工具包 B2B就是MIL V SIL 适用于MBD开发的测试&#xff0c;单独SIL适用于手写…

【Jmeter教程】__将提取的参数并设置成全局变量(常用于提取token)

目录 一、提取参数 1、使用正则表达式提取器提取token 2、使用json提取器提取token 二、将提取参数设置成全局变量 三、常见问题 一、提取参数 1、使用正则表达式提取器提取token 查看登录响应参数找出token。图中token为 "ticketString": "ccf26b17-a96f…

深入理解MySQL主从配置原理

目录 1. MySQL主从复制原理工作原理 2. 主从配置步骤1: 配置主节点2: 备份主节点数据3: 配置从节点4: 启动主从复制 3.常见问题4. 需要考虑的一些因素 MySQL主从复制是一种数据库复制技术&#xff0c;通过将一个MySQL服务器&#xff08;主节点&#xff09;上的数据同步到其他My…

IP地点定位为什么有误差?

随着互联网的不断普及&#xff0c;人们对IP地点定位需求越来越多。然而&#xff0c;即便是在现代技术的支持下IP地点定位仍然存在误差。那么&#xff0c;IP地点定位为什么会出现误差呢&#xff1f; IP&#xff08;Internet Protocol&#xff09;地址是指互联网协议&#xff08;…

SpringCloudSpringcloudAlibaba

SpringCloud 一&#xff1a;微服务架构1.1 ESB1.2 微服务与微服务 二 &#xff1a;编写SpringCloud代码2.1 父模块SpringCloudDemo项目2.2 公共类模块SpringCloud-api项目2.3 消费模块SpringCloud-user-8001项目2.4 RestTemplate 三&#xff1a;注册中心&#xff1a;Eureka3.1 …

机器学习——Kmeans算法

一、实验目的 学习sklearn模块中的KMeans算法 二、实验内容 学习KMeans算法&#xff0c;了解模型创建、使用模型及模型评价等操作 三、实验原理或流程 实验原理&#xff1a; K-means算法是将样本聚类成k个簇(cluster)&#xff0c;具体算法描述如下: 1、随机选取k个聚类质…

春招上岸阿里,好多问题当场尬住!

一个粉丝&#xff0c;23年应届毕业生&#xff0c; 双非本科。最近他校招上岸了&#xff0c;拿到了阿里软件测试岗位的Offer。 他总结了一下面试题&#xff0c;感觉很多内容还是有难度的&#xff0c;尤其是对于应届生来说。下面是他整理的面试题&#xff0c;看看这种校招面试难…