Java netty编码器中的堆栈溢出
在第一次初始化通道时,我想在发送实际消息之前发送自己的自定义消息。我有:Java netty编码器中的堆栈溢出,java,netty,Java,Netty,在第一次初始化通道时,我想在发送实际消息之前发送自己的自定义消息。我有: public class MyClientInitializerFactory extends ClientInitializerFactory { @Override protected void initChannel(Channel ch) { ChannelPipeline pipeline = ch.pipeline(); pipeline.addLast(new EncoderTwo());
public class MyClientInitializerFactory extends ClientInitializerFactory {
@Override
protected void initChannel(Channel ch) {
ChannelPipeline pipeline = ch.pipeline();
pipeline.addLast(new EncoderTwo());
pipeline.addLast(new EncoderOne());
}
}
电子编码器:
public class EncoderOne extends MessageToMessageEncoder<Object> {
@Override
protected void encode(ChannelHandlerContext ctx, Object msg, List<Object> out) throws Exception {
byte[] bytes = "ABCD".getBytes(StandardCharsets.UTF_8);
ByteBuf byteBuf = Unpooled.buffer(bytes.length);
Channel channel = ctx.channel();
channel.writeAndFlush(byteBuf);
out.add(msg); // retaining original message for further processing
ctx.pipeline().remove(this);
}
我做错了什么?问题是调用
channel.writeAndFlush(byteBuf)编码器中的code>,这意味着它将再次从尾部开始流经管道,从而再次在编码器中结束。因此,要么在调用编码器之前先删除它,要么调用ctx.writeAndFlush(…)
另一种方法是将byteBuf
添加到out列表中,然后直接调用flush()?你为什么这么做?msg
的类型是什么?它是一个字符串。我将它添加到列表中,因为我需要在那里处理它,并在处理后发送。谢谢!将byteBuf添加到out列表中不会将其与原始消息一起传递给下一个编码器吗?
ByteBuf byteBuf = Unpooled.buffer(bytes.length);
Channel channel = ctx.channel();
channel.writeAndFlush(byteBuf);