- 📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!
- 📢本文作者:由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这位大明星啊!