每个连接channel都会创建一个ChannelPipeline,它将多个ChannelHandler组装起来,当收发消息时,按一定顺序和规则将消息传播给各个ChannelHandler进行处理。
入站处理和出站处理
ChannelHandler分入站(ChannelInboundHandler)和出站(ChannelOutboundHandler),收到消息做入站处理,发出消息做出站处理。假如在ChannelPipeline中按顺序放入5个ChannelHandler,第1、3、5是入站,收到消息时按顺序触发。第2、4是出站。发出消息时会按逆向顺序触发。

出站是按逆向顺序,假如在入站3的时候就结束入站处理,并且发出消息触发出站,按逆向出站只能触发出站2,而不会触发4和5。只有在入站5发出消息触发出站,才会先后触发出站4和2。
ChannelPipeline操作
ChannelPipeline内的ChannelHandler数量或顺序都可以动态进行调整修改
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
public void initChannel(SocketChannel ch) throws Exception {
ch.pipeline().addLast("handler1",new Handler1());//1添加到结尾
ch.pipeline().addLast("handler2",new Handler2());//2添加到结尾
ch.pipeline().addfirst("handler3",new Handler3());//3添加到开头
ch.pipeline().remove("handler1");//移除1
ch.pipeline().replace("handler2","handler4",new Handler4());//4替代2
ch.pipeline().addBefore("handler3","handler5",new Handler5());//在3前面添加5
ch.pipeline().addAfter("handler3","handler6",new Handler6());//在3后面添加6
本文详细解析了Java NIO中的ChannelPipeline,阐述了ChannelHandler的入站和出站处理机制,以及如何动态调整ChannelPipeline中的ChannelHandler。重点介绍了添加、移除和替换ChannelHandler的方法,对于网络编程开发者理解NIO架构至关重要。
474

被折叠的 条评论
为什么被折叠?



