我碰到了一个看起来像这样的问题: 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
答案 0 :(得分:0)
我找到了根本原因并为此解决了这个问题:
(问题)当大消息到达时,它构造成一条消息 超出字节流包。在此期间,没有其他消息应该 在那个频道被问到,甚至小ping / pong都会干扰 并将腐败数据插入到施工中。
(解决方案)为了不干扰,我使用队列顺序 消息和仅当完整消息时 接到下一次往返是否被调用,是否是a ping / pong或其他请求/响应。