【.Net】DotNetty

文章目录

概述

本系列文章主要讲述由微软Azure团队研发的.net的版本的netty,Dotnetty。所有的开发都将基于.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的使用示例

csharp 复制代码
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)
.Channel<TcpServerSocketChannel>()
.Option(ChannelOption.SoBacklog, 100)
.Handler(new LoggingHandler("LISN"))
.ChildHandler(new ActionChannelInitializer<ISocketChannel>(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 : SimpleChannelInboundHandler<IByteBuffer>
{
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,它将客户端发送来的任何消息原封不动地返回给客户端。可以通过以下方式启动该应用程序:

bash 复制代码
dotnet run

启动后,在另一个终端窗口中使用telnet命令连接到服务器:

bash 复制代码
telnet localhost 8888

连接成功后,输入任意字符串,可以看到服务器返回了一模一样的字符串。

来源

.NET Core3.1 Dotnetty实战第一章
DotNetty一个高性能的基于.Net 平台开发的网络通信框架

相关推荐
喵叔哟21 分钟前
16. 【.NET 8 实战--孢子记账--从单体到微服务】--汇率获取定时器
微服务·oracle·.net
zhy8103027 小时前
.net6 使用 FreeSpire.XLS 实现 excel 转 pdf - docker 部署
pdf·.net·excel
初九之潜龙勿用7 小时前
C#校验画布签名图片是否为空白
开发语言·ui·c#·.net
慧都小妮子8 小时前
Spire.PDF for .NET【页面设置】演示:打开 PDF 时自动显示书签或缩略图
java·pdf·.net
霍先生的虚拟宇宙网络10 小时前
.net 支持跨平台(桌面)系列技术汇总
.net
djk888810 小时前
.net的winfrom程序 窗体透明&打开窗体时出现在屏幕右上角
.net
九鼎科技-Leo19 小时前
什么是 WPF 中的依赖属性?有什么作用?
windows·c#·.net·wpf
dot.Net安全矩阵1 天前
.NET 通过模块和驱动收集本地EDR的工具
windows·安全·web安全·.net·交互
zls3653651 天前
.NET开源实时应用监控系统:WatchDog
.net
djk88881 天前
.net将List<实体1>的数据转到List<实体2>
数据结构·list·.net