消息构造干扰

时间:2014-07-08 18:15:16

标签: netty

我碰到了一个看起来像这样的问题:  1)我有很长的消息〜在ByteToMessageDecoder中构造了70Kb - 让我们称之为BlockMessage  2)在此期间有定时器做Ping / Pong,  即发送Ping并获得Pong短消息〜8字节。  (!!!)问题是,有时我看到Pong消息干扰了BlockMessage,并且这会打破消息构造。

可以这样描述:

1)我正在进行中 阅读消息:

@Override
protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {

    // No header for Eth. message
    if (in.readableBytes() < 8) return;

    long magicBytes = in.readUnsignedInt();
    long msgSize = in.readUnsignedInt();

    if (!((magicBytes >> 24   &  0xFF) == 0x22  &&
          (magicBytes >> 16   &  0xFF) == 0x40  &&
          (magicBytes >>  8   &  0xFF) == 0x08  &&
          (magicBytes         &  0xFF) == 0x91 )) {

        logger.error("abandon garbage, wrong magic bytes: [ {} ] msgSize: [ {} ]", magicBytes, msgSize);
        ctx.close();
    }

    // Don't have the full packet yet
    if (msgSize > in.readableBytes()) {

        logger.debug("msg decode: magicBytes: [ {} ], readBytes: [ {} ] / msgSize: [ {} ] ", magicBytes, in.readableBytes(), msgSize);
        in.resetReaderIndex();
        return;
    }

    logger.debug("message fully constructed go handle it: readBytes: [ {} ] / msgSize: [ {} ]", in.readableBytes(), msgSize);

    byte[] decoded = new byte[(int)msgSize];
    in.readBytes(decoded);

    out.add(decoded);

    in.markReaderIndex();

}

2)在此期间:计时器调用ping并从中获取pong 对等

3)我在1)的框架内得到了这个乒乓球

我认为这是一个非常简单和常见的案例,但我没有找到任何例子和 问题是如何避免帧干扰?

P.S。我使用:4.0.17.Final

1 个答案:

答案 0 :(得分:0)

我找到了根本原因并为此解决了这个问题:

(问题)当大消息到达时,它构造成一条消息 超出字节流包。在此期间,没有其他消息应该 在那个频道被问到,甚至小ping / pong都会干扰 并将腐败数据插入到施工中。

(解决方案)为了不干扰,我使用队列顺序 消息和仅当完整消息时 接到下一次往返是否被调用,是否是a ping / pong或其他请求/响应。