文章摘要(AI生成)
netty中的管道处理器是用于网络通信中的数据的初始化、处理器的注册以及通道数据的读写。默认的管道实现是DefaultChannelPipeline,它是一个处理器双向链表,包含头节点和尾节点处理器。当我们调用管道的addLast方法添加处理器时,会向链表中添加一个DefaultChannelHandlerContext,其中包含了上下节点和ChannelHandler。ChannelHandler负责消息的传递和写入,通道入道处理器读取对方发送的消息内容,通道出道处理器将消息写入通道。在服务端通道注册时,默认状态为接收就绪,而客户端通道注册时,默认状态为读就绪。总的来说,netty的管道处理器是用于网络通信中初始化、处理器注册和数据读写的机制。
管道处理器
netty中,网络通道的初始化和处理器注册、通道数据的读写都是管道完成的。默认的管道实现是DefaultChannelPipeline
,它主要是一个处理器双向链表,默认包含头节点处理和尾节点处理器:
final AbstractChannelHandlerContext head;
final AbstractChannelHandlerContext tail;
protected DefaultChannelPipeline(Channel channel) {
// channel不能为空,否则抛出异常
this.channel = ObjectUtil.checkNotNull(channel, "channel");
succeededFuture = new SucceededChannelFuture(channel, null);
voidPromise = new VoidChannelPromise(channel, true);
tail = new TailContext(this);
head = new HeadContext(this);
head.next = tail;
tail.prev = head;
}
而AbstractChannelHandlerContext
的类关系图如下,当我们调用管道的addLast
方法添加处理器时,他会向链表中添加一个DefaultChannelHandlerContext
, 而DefaultChannelHandlerContext
中除了上下节点元素之外,其元素值即是我们的ChannelHandler
.
而ChannelHandler
的实现如下:
其分别包含了负责消息逐级传递的通道入道处理器和负责消息实际写入的通道出道处理器。通道入道处理器负责读取对方发送过来的消息内容(例如通道注册、读取请求等),而通道储到管理器则是有我们将消息写入到通道中(例如端口绑定、连接发送和接收等)
服务端通道注册
当服务端管道注册时,创建后的服务端管道默认状态位为接收就绪
客户端通道注册
当客户端通道注册时,创建后的客户端端通道默认状态位为读就绪
当客户端通道连接服务端,
连接完成时,则将客户端通道的状态位更新为读就绪
处于连接中时,则将客户端通道的状态位更新为连接就绪,等待轮询时重试
服务端接收连接
事件循环中的轮询监听到服务端通道有连接请求时,调用管道处理器中我们在服务端启动器中向其添加的ServerBootstrapAcceptor
管道处理器进行连接的接收,他会为我们的连接在服务端创建相应的客户端通道,在客户端通道初始化时会将我们自定义的编解码处理器添加到管道中。
数据读写
事件循环中的轮询监听到客户端通道有访问请求时,调用管道处理器中我们在自定义的管道处理器进行请求数据的处理,如果我们在自定义的管道处理器中向通道内写入数据,那么通道的状态会更新为写就绪,这时轮询会进听到写就绪因而进行缓存的刷新。
评论区