在通道初始化后添加Netty处理程序:Netty 4.0.17.Final

在通道初始化后添加Netty处理程序:Netty 4.0.17.Final,netty,Netty,我创建了一个带有channelInitializer的NettyServer,它在initChannel方法中设置管道。然后我打电话 b.bindPort(端口).sync().channel().pipeline().addLast(处理程序)。 在初始化管道之前添加处理程序,我想是因为同步只等待创建通道 问题是,在管道已经初始化之后,如何将处理程序添加到管道的末尾 另外,如何确保在服务器接收任何消息之前添加最后一个处理程序 谢谢。这本书有以下几点: 您可以在初始化器中添加多个处理程序:

我创建了一个带有channelInitializer的NettyServer,它在initChannel方法中设置管道。然后我打电话

b.bindPort(端口).sync().channel().pipeline().addLast(处理程序)。
在初始化管道之前添加处理程序,我想是因为同步只等待创建通道

问题是,在管道已经初始化之后,如何将处理程序添加到管道的末尾

另外,如何确保在服务器接收任何消息之前添加最后一个处理程序

谢谢。

这本书有以下几点:

您可以在初始化器中添加多个处理程序:

    @Override
    protected void initChannel(Channel ch) throws Exception {
      ChannelPipeline pipeline = ch.pipeline();
      if (client) {
          pipeline.addLast("codec", new HttpClientCodec());
      } else {
          pipeline.addLast("codec", new HttpServerCodec());
      }
      pipeline.addLast("aggegator",
        new HttpObjectAggregator(512 * 1024));
    }
对ChannelPipeline的修改可以动态完成,这意味着您甚至可以从另一个ChannelHandler中添加/删除/替换ChannelHandler,或者让它自己删除。这允许编写灵活的逻辑,如多路复用器

以后添加处理程序时,可以使用handlerAdded事件存储ChannelHandlerContext供以后使用:

    @Override
    public void handlerAdded(ChannelHandlerContext ctx) {
      this.ctx = ctx;
    }

WebSocketServerProtocolHandler可能是动态更改管道的一个很好的示例。

我在初始值设定项中添加了多个处理程序,但我希望在初始化后动态添加一个处理程序。我不必这样做——我可以将处理程序传递给初始值设定项,但这会使我的代码更干净。我想我可以使用addAfter(lastHandler,handler)而不是addLast(handler),但这需要了解lastHandler,从而降低代码的健壮性。api文档对于通道包、图片、好文本等都非常有用。从netty 4.X开始,我相信您的处理程序是在使用通道初始值设定项初始化管道之后添加的。