gpt4 book ai didi

java - Netty 中 ChannelInitializer 相对于 Channel Handler 的优势

转载 作者:搜寻专家 更新时间:2023-11-01 02:43:28 24 4
gpt4 key购买 nike

与直接使用 ChannelHandler 链相比,使用 ChannelInitializer 有什么优势?

例如,我可以使用服务器 Bootstrap :

bootstrap.childHandler(channel_handler);

在 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());
}
}

在 ChannelInitializer 的情况下

        ch.pipeline().addLast(
new channel_handler_1(),
new channel_handler_2()
);

在我可以做的每个处理程序中

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
}
}

那么唯一的优势是 channel 处理程序不需要了解它在何处触发 channel 读取吗?我没有看到使用 channel 初始化程序的任何其他优势

最佳答案

根据文档(参见此处 http://netty.io/wiki/user-guide-for-4.x.html)

The handler specified here will always be evaluated by a newly accepted Channel. The ChannelInitializer is a special handler that is purposed to help a user configure a new Channel. It is most likely that you want to configure the ChannelPipeline of the new Channel by adding some handlers such as DiscardServerHandler to implement your network application. As the application gets complicated, it is likely that you will add more handlers to the pipeline and extract this anonymous class into a top level class eventually.

因此 ChannelInitializer 是一种根据需要添加处理程序的简洁方法,尤其是当您有多个处理程序时。

它不会阻止让一个处理程序添加更多处理程序(就像您在第一个示例中所做的那样),例如根据上下文在管道中动态添加/删除一个处理程序,但对于“静态”或“默认”系列处理程序,使用 ChannelInitializer 是一种更简洁的方法,因为它非常接近 Bootstrap 定义,因此更具可读性。

关于java - Netty 中 ChannelInitializer 相对于 Channel Handler 的优势,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28189380/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com