引:其实前面就多次提到了ChannelPipeline,但是都没有详细说明ChannelPipeline是如何工作的,这里我们就具体看看这个管理处理逻辑的抽象以及处理逻辑的抽象ChannelHandler。
ChannelPipeline的创建
通过前面的讲解,我们应该还记得一个Channel对应了一个ChannelPipeline,而ChannelPipeline也就是在创建Channel的时候随之创建的。我们就从那里开始。
1 | // step 1 AbstractChannel的创建 |
ChannelPipeline创建完毕!!
节点的添加
节点的添加我们必然要从我们见过的ChannelPipeline的addLast(handler)方法开始分析:
1 | // step 1 |
节点的删除
和ChannelPipeline的addLast(handler)一样,我们可以找到ChannelPipeline的remove(handler)方法:
1 | // step 1 |
入站事件的传播
其实我们应该已经经历过了,源头都是在从Unsafe对象(它负责最底层的IO操作)出发的,所以我们从NioEventLoop的这一段代码出发:
1 | // step 1 |
出站事件的传播
出站事件一般是写事件,有两种写需要区别一下:(来自netty源码中telnet例子)
1 | ChannelFuture future = ctx.channel().write(response); // 1 |
我们先看第一种:
1 | // step 1 |
第二种情况:
1 | // step 1 |