DotNetty学习(二)——世界上最简单的服务(Discard)服务端

总览链接:

https://blog.csdn.net/a1234012340a/article/details/91040073


世上最简单的协议不是'Hello, World!' 而是 DISCARD(抛弃服务)。这个协议将会抛弃任何收到的数据,而不响应。

为了实现 DISCARD 协议,你只需忽略所有收到的数据。

1.创建规则

让我们从 handler (处理器)的实现开始,handler 是由 Netty 生成用来处理 I/O 事件的。

1.1、DiscardServerHandler 继承自 ChannelInboundHandlerAdapter

这个类实现了 ChannelInboundHandler接口,ChannelInboundHandler 提供了许多事件处理的接口方法,然后你可以覆盖这些方法。现在仅仅只需要继承 ChannelInboundHandlerAdapter 类而不是你自己去实现接口方法。如图:

1.2、创建接收数据方法

chanelRead()方法是每当从客户端收到新的数据时, 这个方法会在收到消息时被调用。

这里我们覆盖了 chanelRead() 事件处理方法。每当从客户端收到新的数据时,这个方法会在收到消息时被调用,这个例子中,收到的消息的类型是 ByteBuf

ByteBuf简介可以参考这位大神的介绍。在此不重复讲述

1.3、实现抛弃

为了实现 DISCARD 协议,处理器不得不忽略所有接受到的消息。ByteBuf 是一个引用计数对象,这个对象必须显示地调用 release() 方法来释放。请记住处理器的职责是释放所有传递到处理器的引用计数对象。通常,ChannelRead() 方法的实现就像下面的这段代码:

当然你也可以直接继承DotNetty.Transport中的SimpleChannelInboundHandler来实现抛弃。

using DotNetty.Transport.Channels;

直接继承SimpleChannelInboundHandler然后实现channelRead0()这个方法就可以了,非常简单。

1.4、异常处理

ExceptionCaught() 事件处理方法是当出现 Throwable 对象才会被调用,即当 Netty 由于 IO 错误或者处理器在处理事件时抛出的异常时。在大部分情况下,捕获的异常应该被记录下来并且把关联的 channel 给关闭掉。然而这个方法的处理方式会在遇到不同异常的情况下有不同的实现,比如你可能想在关闭连接之前发送一个错误码的响应消息。

如图所示为什么也不做。直接关闭连接

 

特殊发现。在官方给出的例子中不难发现还有一个ChannelReadComplete方法。目前看起来没什么用。

经过一番调查发现好像是在读取结束时才会调用此方法。具体作用以后补充

至此。规则就算是定义好了。下面我们需要把这个规则”应用“起来,通常就是我们通常的”运行“。

2.应用规则

2.1、IEventLoopGroup/MultithreadEventLoopGroup创建

1.IEventLoopGroup 是用来处理I/O操作的多线程事件循环器,DotNetty 提供了许多不同的 EventLoopGroup 的实现用来处理不同的传输。

在这个例子中我们实现了一个服务端的应用,因此会有2个 IEventLoopGroup 会被使用:

第一个经常被叫做‘boss’,用来接收进来的连接。

第二个经常被叫做‘worker’,用来处理已经被接收的连接。

一旦‘boss’接收到连接,就会把连接信息注册到‘worker’上。如何知道多少个线程已经被使用,如何映射到已经创建的 Channel上都需要依赖于 EventLoopGroup 的实现,并且可以通过构造函数来配置他们的关系。

据我观察有两种创建方式

而且注意。如果第二种方式声明则信道一定要使用TcpServerSocketChannel方式不可以使用TcpServerChannel方式

具体原因待调查。本人确实小白

这是我在使用了TcpServerChannel信道方式时的报错。希望大神给予解答

如果我使用如下信道则不会报错

第一种为注释部分

2.2、声明一个服务端Bootstrap

声明一个服务端Bootstrap,每个Netty服务端程序,都由ServerBootstrap控制,通过链式的方式组装需要的参数

ServerBootstrap 是一个启动 Transport 服务的辅助启动类。你可以在这个服务中直接使用 Channel

通过链式的方式组装需要的参数(何为链式?ServerBootstrap.方法1().方法2().方法3()

ServerBootstrap继承自AbstractBootstrap功能作为入口,构建服务端和客户端

.Option    

              ChannelOption.SoBacklog为socket的标准参数,并不是DotNetty自己的

              参数标识当服务器请求处理线程全满时,用于临时存放已完成三次握手的请求的队列的最大长度

              完整写法.Option(ChannelOption.SoBacklog, 100)

.group

              设置主和工作线程组,这个没什么说的。

.Channel

              设置通道模式

              这里我申明服务端通信通道为TcpServerSocketChannel

              serverBootstrap.Channel<TcpServerSocketChannel>()          

.ChildHandler

               设置工作线程参数

               

                其中业务handler就是刚刚我们已经写好的规则

2.3、绑定监听的端口

这一步其实就很简单了,同时绑定了端口就意味着服务已经启动

当然你也可以优雅的关闭你的服务

2.4、释放指定工作组的线程

上面2.1-2.3都是写在try里面的,只需要在finally中释放掉就可以了

至此服务端打完收工

 

 


完全个人研究,有错希望大神纠正。也可留下您的联系方式,共同探讨

——————————————————————————————————

作者:Henny_CHN

转载请标明出处,原文地址:  

https://blog.csdn.net/a1234012340a/article/details/91041956

如果感觉本文对您有帮助,请留下您的赞,您的支持是我坚持写作最大的动力,谢谢!

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值