我有一个使用 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/