Netty学习(七)介绍Netty的组件

120 阅读3分钟

一、说说核心组件

​ 上一章节我们介绍了,Netty的原理图并写了一个Netty的简单实现,下面我们介绍下核心组件。

1、Bootstrap、ServerBootstrap

这个是引导启动类。主要用途就是为了启动Netty项目。Bootstrap对应客户端,ServerBootstrap对应服务端。


public class ServerBootstrap extends AbstractBootstrap<ServerBootstrap, ServerChannel> {
    //用来设置线程组,对应前一章节的bossgroup和workergroup
    public ServerBootstrap group(EventLoopGroup parentGroup, EventLoopGroup childGroup) {}
    //用于服务器端绑定端口
    public ChannelFuture bind(int inetPort) {}
    //用于指定服务器端ServerSocketChannel的实现类型
    public B channel(Class<? extends C> channelClass) {}
    //设置ServerChannel的属性
    public <T> B option(ChannelOption<T> option, T value) {}
    //设置业务处理的属性
    public <T> ServerBootstrap childOption(ChannelOption<T> childOption, T value) {}
    //设置业务处理器
    public ServerBootstrap childHandler(ChannelHandler childHandler) {}
}    

2、Future、ChannelFuture

Netty中的io操作都是异步操作,我们可以通过future-lisener机制来监听异步返回的结果。

3、Channel

常见的类型:

名称介绍
NioSocketChannel异步的客户端TCP socket连接
NioServerSocketChannel异步的服务端TCP socket连接
NioDatagramChannel异步的UDP连接
NioSctpChannel异步的客户端sctp连接
NioSctpServerChannel异步的服务端sctp连接

4、ChannelHandler

业务处理器常通过实现这个的子类去设置各种操作。

通过下面的图去了解类的继承关系

  • ChannelInboundHandler 用于处理入站 I/O 事件。
  • ChannelOutboundHandler 用于处理出站 I/O 操作。

适配器

  • ChannelInboundHandlerAdapter 用于处理入站 I/O 事件。
  • ChannelOutboundHandlerAdapter 用于处理出站 I/O 操作。
  • ChannelDuplexHandler 用于处理入站和出站事件。

5、ChannelPipeline

上图:

  • ChannelPipeline 是一个 Handler 的集合,它负责处理和拦截 inbound 或者 outbound 的事件和操作,相当于一个贯穿 Netty 的链。(也可以这样理解:ChannelPipeline 是 保存 ChannelHandlerList,用于处理或拦截 Channel 的入站事件和出站操作)

  • ChannelPipeline 实现了一种高级形式的拦截过滤器模式,使用户可以完全控制事件的处理方式,以及 Channel 中各个的 ChannelHandler 如何相互交互

  • 一个 Channel 包含了一个 ChannelPipeline,而 ChannelPipeline 中又维护了一个由 ChannelHandlerContext 组成的双向链表,并且每个 ChannelHandlerContext 中又关联着一个 ChannelHandler

  • 入站事件和出站事件在一个双向链表中,入站事件会从链表 head 往后传递到最后一个入站的 handler,出站事件会从链表 tail 往前传递到最前一个出站的 handler,两种类型的 handler 互不干扰

6、Unpooled

这个组件是Netty用来处理缓冲区的工具类,看下源码

public final class Unpooled {
    //通过给定的数据和字符编码返回一个 ByteBuf 对象(类似于 NIO 中的 ByteBuffer 但有区别)
    public static ByteBuf copiedBuffer(char[] array, Charset charset) {}
}

二、心跳机制

Netty有自己的心跳检测机制,通过提供的IdleStateHandler类来实现。

public class IdleStateHandler extends ChannelDuplexHandler {
    //这个方法用来定义一个心跳检测器,三个参数,第一个参数表示多久没有读操作;第二个参数表示多久没有写操作;第三个参数表示多久没有读写操作
    public IdleStateHandler(
            long readerIdleTime, long writerIdleTime, long allIdleTime,
            TimeUnit unit) {
        this(false, readerIdleTime, writerIdleTime, allIdleTime, unit);
    }
}