Netty 4-切片问题
我正在尝试使用netty 4.0.10.Final创建零拷贝应用程序。我在切片方面有问题。以下是我的解码方法:Netty 4-切片问题,netty,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_O
@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->ChannelInitializer->ByteToMessageDecoder->ByteToMessageDecoder->MessageToMessageDecoder开始
当消息不完整的帧到达时,会出现问题。
典型用例:
-接收到的帧短于预期的消息,消息头中有长度字段
-接收到另一个帧,该帧完成未完成的消息并承载另一个未完成的消息
-创建完整消息的切片,不完整消息等待其正文的其余部分。所有三个都是ByteBuftoHextString日志
-切片被传递到下一个ChannelHandler,它也是ByteToMessageDecoder
-切片bytebuf中发送的数据已更改-使用了不完整消息的字节,而不是完整消息的字节
-如果完整的消息比通常不完整的消息长,则使用剩余的完整消息字节
示例粗体-完整消息,斜体-不完整消息:
原缓冲器-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的结果相同。
复制数据的工作原理是复制的bytebufs中的数据不共享
有人看到错误了吗?有人能帮忙吗 我认为这在Netty 4.0.12.Final中已作为此提交的端口修复:
谢谢,用netty的版本解决了这个问题。下次我必须更仔细地检查变更记录太棒了。。。谢谢你让我知道。我必须承认,提交消息在这里也没有多大帮助