在 netty 编码器中获取 Stackoverflow
Getting Stackoverflow in netty Encoder
我想在发送实际消息之前发送我自己的自定义消息,第一次初始化通道。我有:
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);
}
EncoderTwo 处理实际消息并将其发送到网络,但我的消息从未到达那里。当我尝试发送任何内容时,这些行会一遍又一遍地执行,直到我得到 Whosebug:
ByteBuf byteBuf = Unpooled.buffer(bytes.length);
Channel channel = ctx.channel();
channel.writeAndFlush(byteBuf);
我做错了什么?
问题是您在编码器中调用 channel.writeAndFlush(byteBuf);
,这意味着它将再次从尾部开始流过管道,因此再次进入您的编码器。所以要么在调用它之前先删除编码器,要么调用 ctx.writeAndFlush(...)
另一种方法是将 byteBuf
添加到输出 List
中,然后直接调用 flush()
.
我想在发送实际消息之前发送我自己的自定义消息,第一次初始化通道。我有:
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);
}
EncoderTwo 处理实际消息并将其发送到网络,但我的消息从未到达那里。当我尝试发送任何内容时,这些行会一遍又一遍地执行,直到我得到 Whosebug:
ByteBuf byteBuf = Unpooled.buffer(bytes.length);
Channel channel = ctx.channel();
channel.writeAndFlush(byteBuf);
我做错了什么?
问题是您在编码器中调用 channel.writeAndFlush(byteBuf);
,这意味着它将再次从尾部开始流过管道,因此再次进入您的编码器。所以要么在调用它之前先删除编码器,要么调用 ctx.writeAndFlush(...)
另一种方法是将 byteBuf
添加到输出 List
中,然后直接调用 flush()
.