【问题标题】:Use of ctx.read() vs. ctx.channel.read() in Netty Examples在 Netty 示例中使用 ctx.read() 与 ctx.channel.read()
【发布时间】:2023-03-09 19:45:02
【问题描述】:

Netty 的流水线(即ctx.foo() vs ctx.channel.foo())之前在 StackOverflow 上已经解释过两次:

  1. Any difference between ctx.write() and ctx.channel().write() in netty?
  2. In Netty 4, what's the difference between ctx.close and ctx.channel.close?

但是,我不明白 Netty 的示例背后的直觉是什么时候使用不同的方法:

public void channelActive(ChannelHandlerContext ctx) {
    ctx.read(); // <----- HERE
}

public void channelRead(final ChannelHandlerContext ctx, Object msg) {
    inboundChannel.writeAndFlush(msg).addListener(new ChannelFutureListener() {
        public void operationComplete(ChannelFuture future) {
            if (future.isSuccess()) {
                ctx.channel().read(); // <----- HERE
            } else {
                future.channel().close();
            }
        }
    });
}

View source on GitHub


为什么在代理impl的channelActive处理程序中使用'从这个处理程序向下'样式read,而在channelRead中使用'从顶部'样式read

【问题讨论】:

    标签: java netty


    【解决方案1】:

    当使用ChannelHandlerContext.read() 时,它将从ChannelPipelineChannelHandler 所在的点开始。当您使用Channel.read() 时,它将从ChannelPipeline 的尾部开始,因此需要遍历整个ChannelPipeline 以进行更糟糕的转换。

    此示例在channelActive(...) 中使用ctx.read() 而在ChannelFutureListener 中使用channel.read() 的原因是因为ChannelFutureListener 不是ChannelHandler 的一部分,因此它需要从尾部开始ChannelPipeline。还要注意Channels 在这里是不同的。

    【讨论】:

    • 我还没有完全理解这一点。当您说“它将从处理程序所在的管道中的点开始”时,在后续处理程序上究竟调用了什么。 AFAIK 当您调用 .read() 时,您所做的只是要求套接字读取一些数据......然后如果/当数据到达时,channelRead 将在 start 的反正管道。或者当您调用ctx.read() 时,如果/当数据到达时,之前的处理程序是否不会收到任何数据?
    • 如果您的ChannelPipeline 中有ChannelOutboundHandler,则这些read(...) 回调将由read() 操作触发并可能执行某些操作(例如,丢弃它)。跨度>
    猜你喜欢
    • 1970-01-01
    • 2017-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多