信阳网站开发公司电话,新东方培训机构官网,做属于公司的网站有什么好处,城阳网站开发公司电话文章目录 概述NIO和BIO、AIODotNetty适用场景DotNetty的整体架构和模块DotNetty的使用示例来源 概述
本系列文章主要讲述由微软Azure团队研发的.net的版本的netty#xff0c;Dotnetty。所有的开发都将基于.net core 3.1版本进行开发。
Dotnetty是什么#xff0c;原本Netty是… 文章目录 概述NIO和BIO、AIODotNetty适用场景DotNetty的整体架构和模块DotNetty的使用示例来源 概述
本系列文章主要讲述由微软Azure团队研发的.net的版本的nettyDotnetty。所有的开发都将基于.net core 3.1版本进行开发。
Dotnetty是什么原本Netty是由JBOSS提供的一个java开源框架后来由微软抄了一份.net的版本, 是业界最流行的NIO框架整合了多种协议 包括FTP、SMTP、 HTTP等各种二进制文本协议的实现经验精心设计的框架在多个大型商业项目中得到充分验证。
NIO和BIO、AIO
BIO同步阻塞客户端在请求数据的过程中保持一个连接不能做其他事情。 NIO同步非阻塞客户端在请求数据的过程中不用保持一个连接不能做其他事情。不用保持一个连接而是用许多个小连接也就是轮询 AIO异步非阻塞客户端在请求数据的过程中不用保持一个连接可以做其他事情。客户端做其他事情数据来了等服务端来通知。
DotNetty适用场景
DotNetty适用于高性能的网络编程场景特别是需要高并发、低延迟的场景。以下是几个可能使用DotNetty的场景
实时通信如果您正在构建实时通信应用程序例如聊天应用、实时协作平台等DotNetty可以提供高性能、低延迟的基础设施并支持自定义协议和消息格式。游戏服务器游戏服务器需要处理大量并发连接而且需要快速响应玩家的操作。DotNetty可以提供高效的处理器和优化的消息传递以保证游戏体验的流畅性和可扩展性。IoT应用程序IoT应用程序需要处理大量传感器和设备的数据而且需要在较短的时间内对数据进行处理和分析。DotNetty可以提供高效的编解码器和处理器以便更有效地处理传感器和设备数据。大规模分布式系统在大规模分布式系统中节点之间需要进行高频的通信和数据传输。DotNetty可以提供高效的网络通信框架以便更快地传输数据和执行操作。
举个例子如果您正在构建一个远程存储系统该系统需要处理大量同时连接和数据传输那么DotNetty可能是一个很好的选择。通过使用DotNetty您可以实现高性能、低延迟的数据传输并可以自定义协议和消息格式来适应特定的应用场景。
DotNetty的整体架构和模块
DotNetty的整体架构设计基于Netty框架是一个事件驱动的异步I/O框架不同于传统的同步阻塞I/O框架。
在DotNetty中所有网络事件都被封装成Netty的标准事件并由事件循环线程池负责处理。事件循环线程池由两个线程池组成Boss EventLoopGroup和 Worker EventLoopGroup。Boss EventLoopGroup负责管理并分配新连接到Worker EventLoopGroup中而Worker EventLoopGroup则负责维护这些连接和处理读写事件。
DotNetty的整体架构可以分为以下四个部分
Channel通道是业务逻辑和网络逻辑之间的桥梁。在DotNetty中所有的网络数据都通过Channel来进行传输。
EventLoop事件循环是一个单独的线程用来处理特定类型的事件。每个EventLoop都会绑定一个Selector用于监听Channel中感兴趣的事件。当事件发生时该EventLoop会被唤醒来处理该事件。
ChannelPipeline通道管道是一系列的处理器链用于处理输入和输出的数据流。在DotNetty中所有的数据都经过这个管道在这个管道上可以添加多个处理器来实现业务逻辑。
ChannelHandlerContext通道处理器上下文包含了当前通道的所有状态信息每个ChannelHandlerContext都与一个EventLoop相关联。在处理业务逻辑时可以通过ChannelHandlerContext来发送数据、获取当前通道的状态等。
在DotNetty中还有许多组件模块其中比较重要的有
Transport传输层模块用于处理不同协议的网络连接。
Codec编解码模块用于处理消息的编码和解码。
Handler处理器模块用于实现具体的业务逻辑。
Bootstrap启动器模块用于配置和启动应用程序。
DotNetty的使用示例
using System;
using System.Text;
using DotNetty.Buffers;
using DotNetty.Transport.Bootstrapping;
using DotNetty.Transport.Channels;
using DotNetty.Transport.Channels.Sockets;
namespace EchoServer
{
class Program
{
static void Main(string[] args)
{
var bossGroup new MultithreadEventLoopGroup(1);
var workerGroup new MultithreadEventLoopGroup();
try
{
var bootstrap new ServerBootstrap();
bootstrap.Group(bossGroup, workerGroup)
.ChannelTcpServerSocketChannel()
.Option(ChannelOption.SoBacklog, 100)
.Handler(new LoggingHandler(LISN))
.ChildHandler(new ActionChannelInitializerISocketChannel(channel
{
var pipeline channel.Pipeline;
pipeline.AddLast(new LoggingHandler(CONN));
pipeline.AddLast(new EchoServerHandler());
}));
var bindTask bootstrap.BindAsync(8888);
bindTask.Wait();
Console.WriteLine($Echo server started and listening on {bindTask.Result.LocalAddress});
Console.ReadLine();
}
finally
{
workerGroup.ShutdownGracefullyAsync().Wait();
bossGroup.ShutdownGracefullyAsync().Wait();
}
}
}
class EchoServerHandler : SimpleChannelInboundHandlerIByteBuffer
{
protected override void ChannelRead0(IChannelHandlerContext ctx, IByteBuffer msg)
{
Console.WriteLine($Received message: {Encoding.UTF8.GetString(msg.ToArray())});
ctx.WriteAndFlushAsync(Unpooled.CopiedBuffer(msg));
}
public override void ExceptionCaught(IChannelHandlerContext ctx, Exception e)
{
Console.WriteLine($Exception caught: {e.Message});
ctx.CloseAsync();
}
}
}此示例实现了一个Echo Server它将客户端发送来的任何消息原封不动地返回给客户端。可以通过以下方式启动该应用程序
dotnet run启动后在另一个终端窗口中使用telnet命令连接到服务器
telnet localhost 8888连接成功后输入任意字符串可以看到服务器返回了一模一样的字符串。
来源
.NET Core3.1 Dotnetty实战第一章 DotNetty一个高性能的基于.Net 平台开发的网络通信框架