【问题标题】:Netty ByteBuf to byte[] decoderNetty ByteBuf 到 byte[] 解码器
【发布时间】:2019-03-31 00:09:13
【问题描述】:

我想将传入的 Netty 的 ButeBuf 消息转换为我的一个类的 MyBuffer 实例。为此我使用这个MessageToMessageDecoder

class ByteArrayDecoder extends MessageToMessageDecoder<ByteBuf> {
  @Override
  protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List<Object> out) throws Exception {
    int length = msg.readableBytes();
    if (msg.hasArray()) {
      out.add(new MyBuffer(msg.array(), msg.arrayOffset(), length));

    } else {
      byte[] bytes = new byte[length];
      msg.getBytes(msg.readerIndex(), bytes);
      out.add(new MyBuffer(bytes, 0, length));
    }
  }
}

现在由于ByteBuf 消息是引用计数的,我们必须在完成后释放它。这是由我们正在扩展的MessageToMessageDecoder 自动完成的。

既然 ButeBuf 已经发布,这并不意味着 后备阵列有危险?它将被回收,我不确定我会在 MyBuffer 的数组中看到什么。

这个解码器可以安全使用吗?这是正确的编写方式吗?

【问题讨论】:

  • ByteBuf.array() 返回您指定的实际支持数组...一旦您放弃了对它的句柄/引用,引用计数随后下降到 0(立即或当其他一切都放弃它的要求时),所有的赌注都被取消了。如果您需要维护缓冲区中的内容,那么您的 MyBuffer 将必须获取它在其构造函数中接收到的数组的副本。在我最初使用它之后,当一个数组被重新利用时,我一直被这个问题所困扰。当我回到它时 - 繁荣 - 它已被重复使用并且我的数据已经消失了。
  • * 因此可能值得在构造函数中添加一个“复制”标志,指示入站数组是否需要复制。
  • @NotaJD 这个问题的答案很好

标签: java netty


【解决方案1】:

根据@Ferrybig 的建议,我正在将我的评论作为答案!

ByteBuf.array() 返回您指定的实际支持数组...

一旦您放弃了对它的句柄/引用,并且引用计数随后降至 0(立即或当其他一切放弃其声明时),所有赌注都将结束。

如果您需要维护缓冲区中的内容,那么您的 MyBuffer 将必须获取它在其构造函数中接收到的数组的副本。

在我最初使用数组后重新调整用途时,我一直被这个问题所困扰。当我再次使用它时 - 繁荣 - 它已被重复使用并且我的数据已经消失了。

因此可能值得在 MyBuffer 的构造函数中添加一个“复制”标志,指示入站数组是否需要复制。

【讨论】:

    猜你喜欢
    • 2017-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-05
    相关资源
    最近更新 更多