Des*_*Ice 5 java nio channel netty
直接使用ChannelInitializer而不是使用ChannelHandlers链有什么优势?
例如,使用服务器引导程序,我可以执行以下操作:
bootstrap.childHandler(channel_handler);
Run Code Online (Sandbox Code Playgroud)
添加在channel_handler的实现中,我将实现以下内容
class simple_channel_handler implements ChannelHandler
{
public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
// TODO Auto-generated method stub
System.out.println("handler added");
ctx.pipeline().addLast(new simple_channel_handler_2());
}
}
Run Code Online (Sandbox Code Playgroud)
就像ChannelInitializer一样
ch.pipeline().addLast(
new channel_handler_1(),
new channel_handler_2()
);
Run Code Online (Sandbox Code Playgroud)
在每个处理程序中我都可以做
class channel_handler_1 extends ChannelInboundHandlerAdapter
{
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
// TODO Auto-generated method stub
System.out.println("Channel just became active");
ctx.fireChannelRead(ctx); // Fire directly to channel handler 2
}
}
Run Code Online (Sandbox Code Playgroud)
那么,通道处理程序不需要知道将通道读取到何处的唯一好处吗?我看不到使用通道初始化程序的任何其他优势
按照文档(请参阅此处http://netty.io/wiki/user-guide-for-4.x.html)
此处指定的处理程序将始终由新接受的Channel评估。ChannelInitializer是一个特殊的处理程序,旨在帮助用户配置新的Channel。您很可能希望通过添加一些处理程序(例如DiscardServerHandler)来实现新的Channel的ChannelPipeline,以实现您的网络应用程序。随着应用程序变得复杂,您可能会向管道添加更多处理程序,并最终将此匿名类提取到顶级类中。
因此,ChannelInitializer是一种根据需要添加处理程序的干净方法,尤其是如果您有多个处理程序时。
它不会阻止一个处理程序添加更多处理程序(如您在第一个示例中所做的那样),例如,根据上下文在管道中动态添加/删除一个处理程序,而是针对“静态”或“默认”一系列处理程序,所以使用ChannelInitializer是一种更简洁的方法,因为它实际上很接近引导程序定义,因此更具可读性。