我有一个使用 netty 来实现服务器和客户端的应用程序。服务器端将当前时间发送给客户端。

public class TimeServerHandler extends ChannelInboundHandlerAdapter {
    @Override
    public void channelActive(ChannelHandlerContext ctx) {
        System.out.println("in timeserverhandler");
        ChannelFuture f = ctx.writeAndFlush(new UnixTime());
        f.addListener(ChannelFutureListener.CLOSE);
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
        cause.printStackTrace();
        ctx.close();
    }
}

编码器:
  public class TimeEncoder extends ChannelOutboundHandlerAdapter {
    @Override
    public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) {
        System.out.println("in timeencoder");
        UnixTime m = (UnixTime) msg;
        ByteBuf encoded = ctx.alloc().buffer(4);
        encoded.writeInt(m.value());
        ctx.write(encoded, promise); // (1)
    }


}



在 TimeServer 中,如果我将 addList sequnce 更改为注释行,则永远不会调用 Encoder 处理程序并且客户端无法打印出当前时间。为什么会这样,管道中处理程序的执行顺序是什么?

最佳答案

佩德罗是对的。

您通常可以先插入解码器,然后是编码器,最后是您的应用程序处理程序。

一般来说,逻辑是:解码器后跟编码器

如果您有多个编解码器逻辑(例如,第一个编解码器必须后跟第二个编解码器,中间有一个处理程序),那么逻辑将是:

  • pipeline.addLast(decoderProtocol1, encoderProtocol1) 后跟 .addLast(intermediaryHandler1)
  • pipeline.addLast(decoderProtocol2, encoderProtocol2) 后跟 .addLast(intermediaryHandler2)
  • ...
  • pipeline.addLast(decoderProtocoln, encoderProtocoln)
  • pipeline.addLast(finalHandler)

  • 一些解码器/编码器也带有一个处理程序,作为编解码器,那么显然您只需将 pipeline.addLast(decoderProtocoln, encoderProtocoln) 替换为 pipeline.addLast(codecProtocoln)

    文档的正确链接是:
    http://netty.io/4.0/api/io/netty/channel/ChannelPipeline.html

    关于java - netty中channelhandler的顺序是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26997569/

    10-12 04:15