一、说说核心组件
上一章节我们介绍了,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是 保存ChannelHandler的List,用于处理或拦截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);
}
}