核心组件
- 1.Bootstrap和ServerBootstrap
- 2.Future和ChannelFuture
- 3.Channel
- 4.Selector
- 5.NioEventLoop
- 6.NioEventLoopGroup
- 7.ByteBuf
- 8.ChannelHandler
- 9.ChannelHandlerContext
- 10.ChannelPipeline
1.Bootstrap和ServerBootstrap
Bootstrap是Netty的启动程序,⼀个Netty应⽤通常由⼀个Bootstrap开始。Bootstrap的主要作⽤是配置Netty程序,串联Netty的各个组件。
- Bootstrap: 客户端的启动程序
- ServerBootstrap:服务端启动程序
2.Future和ChannelFuture
Netty的所有操作都是异步的,即不能⽴刻得知消息是否被正确处理。因此需要通过Future和ChannelFuture来注册监听器,当操作执⾏成果或者失败来调⽤具体的监听器。
Future通过sync⽅法来获得同步执⾏的效果。
ChannelFuture和Future的子类,提供了针对于Channel的异步监听操作。
3.Channel
Channel是Netty⽹络通信的重要组件,⽤于执⾏⽹络IO操作。Channel具备以下能力:
-
获得当前⽹络连接通道的状态
-
网络连接的配置参数
-
提供异步的⽹络IO操作,⽐如建⽴连接、绑定端⼝、读写操作等
-
获得ChannelFuture实例,并注册监听器到ChannelFuture上,⽤于监听IO操作的成功、失败、取消时的事件回调。
Channel具体的实现类有以下几种:
-
NioSocketChannel: 异步的客户端TCP Socket连接通道
-
NioServerSocketChannel:异步的服务端TCP Socket连接通道
-
NioDatagramChannel:异步的UDP连接通道
-
NioSctpChannel:异步的客户端Sctp连接通道
-
NioSctpServerChannel:异步的服务端Sctp连接通道
4.Selector
通过Selector多路复⽤器实现IO的多路复⽤。Selector可以监听多个连接的Channel事件,同时可以不断的查询已注册Channel是否处于就绪状态,实现⼀个线程可以⾼效的管理多个Channel。
5.NioEventLoop
NioEventLoop内部维护了⼀个线程和任务队列,⽀持异步提交执⾏任务。当线程启动时会调用NioEventLoop的run⽅法来执⾏io任务或非io任务。
-
io任务:如accept、connect、read、write事件等,由processSelectedKeys方法触发。
-
非io任务:如register0、bind0等任务将会被添加到taskQueue任务队列中,由runAllTasks⽅法触发。
6.NioEventLoopGroup
管理NioEventLoop的⽣命周期,可以理解为是线程池,内部维护了⼀组线程。每个线程(即NioEventLoop)负责处理多个Channel上的事件。注意,⼀个Channel只对应⼀个线程,NioEventLoop和Channel它们是⼀对多的关系。
7.ByteBuf
ByteBuf优化了ByteBuffer的使⽤逻辑。ByteBuf底层是⼀个字节数组组成,它提供了两个指针分别标识可读的位置和可写的位置,配合capacity容量属性,将数组划分成三个区域,分别为:
-
已经读取的区域:[0, readerIndex)
-
可读取的区域:[readerIndex,writerIndex)
-
可写的区域:[writerIndex,capacity)
public class ByteBufDemo {public static void main(String[] args) {// 创建一个容量为10的ByteBuf对象ByteBuf buf = Unpooled.buffer(10);System.out.println("init buf:" + buf);for (int i = 0; i < 5; i++) {buf.writeByte(i);}System.out.println("after write:" + buf);// 读数据// 按照索引获取数据for (int i = 0; i < 3; i++) {System.out.println(buf.getByte(i));}System.out.println("after get:" + buf);//读取数据for (int i = 0; i < 3; i++) {System.out.println(buf.readByte());}System.out.println("after read:" + buf);System.out.println("readIndex: " + buf.readerIndex());System.out.println("writerIndex: " + buf.writerIndex());System.out.println("writerIndex(8): " + buf.writerIndex(8));System.out.println("capacity: " + buf.capacity());}
}
8.ChannelHandler
ChannelHandler用于处理拦截IO事件,往往在ChannelHandler中可以加⼊业务处理逻辑。ChannelHandler执⾏完后会将IO事件转发到ChannelPipeline中的下⼀个处理程序。
9.ChannelHandlerContext
保存Channel相关的上下⽂信息,并关联⼀个ChannelHandler对象
10.ChannelPipeline
ChannelPipeline是⼀个双向链表,其中保存着多个ChannelHandler。
ChannelPipeline实现了⼀种⾼级形式的过滤器模式,在IO操作时发⽣的⼊站和出站事件,会导致ChannelPipeline中的多个ChannelHandler被依次调⽤。