Netty 4 - 切片问题

时间:2014-03-04 12:14:09

标签: netty


我正在尝试使用netty 4.0.10.Final创建零拷贝应用程序。我有切片问题。这是我的解码(有问题)方法:

@Override
protected void decode(ChannelHandlerContext chc, ByteBuf bb, List<Object> list) throws Exception {
    int readableBytes = bb.readableBytes();
    if (readableBytes < LENGTH_OF_HEADER) {
        LOGGER.debug("skipping bb - too few data for header: " + readableBytes);
        return;
    }

    int length = bb.getUnsignedShort(bb.readerIndex() + LENGTH_INDEX_IN_HEADER);
    LOGGER.debug("length of actual message: {}", length);

    if (readableBytes < length) {
        if (LOGGER.isDebugEnabled()) {
            LOGGER.debug("skipping bb - too few data for msg: " +
                    readableBytes + " < " + length);
            LOGGER.debug("bb: " + ByteBufUtils.byteBufToHexString(bb));
        }
        return;
    }
    LOGGER.debug("whole bb: " + ByteBufUtils.byteBufToHexString(bb));
    LOGGER.debug("Protocol message received, type:{}", bb.getByte(bb.readerIndex() + 1));

    ByteBuf messageBuffer = bb.slice(bb.readerIndex(), length);
    list.add(messageBuffer);
    bb.skipBytes(length);
    bb.retain();
    LOGGER.debug("BB after slice: " + ByteBufUtils.byteBufToHexString(bb));
}

我的应用程序/ netty也可能收到不完整的消息。

整个管道处理工作正常,同时接收整个消息。我的管道从ServerBootstrap开始 - &gt; ChannelInitializer - &gt; ByteToMessageDecoder - &gt; ByteToMessageDecoder - &gt; MessageToMessageDecoder。

当包含不完整消息的帧到达时,会出现问题。
典型用例
  - 收到的帧短于预期的消息(消息在标题中有长度字段)
  - 收到另一个框架,完成不完整的消息并携带另一个不完整的消息
  - 创建完整消息片,不完整消息等待其余部分(所有三个.byteBufToHexString()日志都正确)
  - slice传递给下一个ChannelHandler(也是ByteToMessageDecoder)
  - 切片字节内部发送的数据已更改 - 使用未完成消息的字节而不是完整的消息字节
  - 如果完整消息比不完整消息长(通常是),则使用完整消息字节的其余部分

示例(粗体 - 完整消息,斜体 - 不完整消息):
原始缓冲区 - 01 02 03 04 05 06 07 08 09 0A
切片缓冲区 - 01 02 03 04 05 06 07
下一个处理程序缓冲区 - 08 09 0A 04 05 06 07

仅在第一个“框架”消息和未完成消息时才会发生这种情况。这两者之间的信息看起来很好。

与.readSlice()相同的结果。
复制数据有效(因为复制的bytebuf中的数据不共享)

有人看到错误吗?有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

我认为这已在Netty 4.0.12.Final中修复为此提交的端口: https://github.com/netty/netty/commit/8930cefab8640fa1bef3d1d49f93a23184b1bafe