当前位置: 首页 > 知识库问答 >
问题:

Netty 4切片问题

强宾白
2023-03-14


我试图用netty 4.0.10.final创建一个零拷贝应用程序。我在切片方面有问题。下面是我的解码(有问题的)html" target="_blank">方法:

@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。

当包含不完整消息的帧到达时,就会出现问题。
典型用法:
-接收到的帧比预期的消息短(消息在标题中有长度字段)
-接收到另一个帧,该帧完成不完整消息并携带另一个不完整消息
-创建完整消息的slice,不完整消息等待其主体的其余部分(所有三个。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()的结果相同。
复制数据有效(因为复制的字节单元中的数据不共享)

有人看到错误了吗?有人能帮忙吗?

共有1个答案

奚英朗
2023-03-14

我想这个问题在Netty 4.0.12中已经修复。最终作为此提交的端口:https://github.com/Netty/Netty/commit/8930cefab8640fa1bef3d1d49f93a23184b1bafe

 类似资料:
  • dubbo 2.5.6版本新增了对netty4通信模块的支持,启用方式如下 provider端: <dubbo:protocol server="netty4" /> 或 <dubbo:provider server="netty4" /> consumer端: <dubbo:consumer client="netty4" /> 注意 provider端如需不同的协议使用不同的通信层框架,

  • 得出的结果是: [0 0] [0 0 6 6 6] [0 0] [0 0 6 6 6 0 0 0 0 0] 请问一下,第三个结果为什么是[0 0],而不是 [0 0 6 6 6] 呢, 在Test2 函数中,使用append的时候,并没有扩容,添加的数据还在底层数组的容量中, 那为啥在 Test2函数之后 s3是[0 0] 即使是在原有的容量基础上扩容,那为啥 s4:=s3[0:10] 是[0 0

  • 问题内容: 我很好奇拆包切片并将其作为参数发送给可变参数函数。 假设我们有一个带有可变参数的函数: 如果我们不想传入一个接口,它就可以工作,那么我们是否拆包都没关系: 如果我们有一片片的话,那会很棘手。在这里,编译器不允许我们传递解压版本: 错误提示: 在解包参数中不能将sliceOfSlices(类型[] [] interface {})用作类型[] interface {} 我不知道为什么会这

  • 我在本地计算机上的骆驼配置中使用了以下路径:from(“netty4:TCP://0.0.0.0:10001?sync=true”)--它在本地计算机上运行良好cmd->netstat-ano findstr 10001 TCP 0.0.0.0:10001 0.0.0.0:0 listing 19596也能够在上面的TCP连接上发送消息 null

  • 取一个list或tuple的部分元素是非常常见的操作。比如,一个list如下: >>> L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack'] 取前3个元素,应该怎么做? 笨办法: >>> [L[0], L[1], L[2]] ['Michael', 'Sarah', 'Tracy'] 之所以是笨办法是因为扩展一下,取前N个元素就没辙了。 取前N个元素

  • 举个例子 给你一个list 让你取前30个怎么办? a = [] # 很多数据 a[0],a[1] #按照这种方式吗?这也太复杂了! for i in a: pass ## 这种方式也是可以的,但是还是有点复杂了,在编程语言中,或者是我们的编程思想中,less is more是最重要的,也就是说,写的越少越好。 # 所以我们可以采用切片的方式 a[1:3],从第二个开始到第