当创建NioEventLoop的时候,可以使用addLast方法添加Handler,如果是ChannelInboundHandler类型,则在读取数据的时候,会调用其read方法,如果是ChannelOutboundHandler类型,则会在写出数据的时候,调用其write()方法
当netty在读写数据的时候,会调用DefaultChannelPipeline的read()和write()方法,在DefaultChannelPipeline中,初始化的时候创建了一个TailContext和一个HeadContext,分别作为读取和写数据的第一个Handler:
protected DefaultChannelPipeline(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;
}
read
当调用read()方法的时候,是从HeadContext开始,从TailContext结束
@Override
public final ChannelPipeline fireChannelRead(Object msg) {
AbstractChannelHandlerContext.invokeChannelRead(head, msg);
return this;
}
@Override
public final ChannelPipeline fireChannelRead(Object msg) {
AbstractChannelHandlerContext.invokeChannelRead(head, msg);
return this;
}
write
当write写数据的时候,从TailContext开始,从HeadContext结束
@Override
public final ChannelFuture write(Object msg) {
return tail.write(msg);
}
@Override
public final ChannelFuture write(Object msg, ChannelPromise promise) {
return tail.write(msg, promise);
}
@Override
public final ChannelFuture writeAndFlush(Object msg, ChannelPromise promise) {
return tail.writeAndFlush(msg, promise);
}
@Override
public final ChannelFuture writeAndFlush(Object msg) {
return tail.writeAndFlush(msg);
}
@Override
public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {
unsafe.write(msg, promise);
}
@Override
public void flush(ChannelHandlerContext ctx) throws Exception {
unsafe.flush();
}