在 netty 编码器中获取 Stackoverflow

我想在发送实际消息之前发送我自己的自定义消息,第一次初始化频道。我有:


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 处理实际消息并将其通过网络发送,但我的消息从未到达那里。当我尝试发送任何内容时,这些行会一遍又一遍地执行,直到我得到 StackOverflow:


 ByteBuf byteBuf = Unpooled.buffer(bytes.length);

 Channel channel = ctx.channel();

 channel.writeAndFlush(byteBuf);

我做错了什么?


蛊毒传说
浏览 100回答 1
1回答

狐的传说

问题是你调用channel.writeAndFlush(byteBuf);了编码器,这意味着它会再次从尾部开始流过管道,然后再次进入你的编码器。因此,要么在调用之前先删除编码器,要么调用ctx.writeAndFlush(...)另一种选择是也直接将 the 添加byteBuf到 outList以及 then call&nbsp;flush()。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java