0
我被撞,看起來像一個問題:我有〜70KB的ByteToMessageDecoder構建長消息 1) - 姑且稱之爲BlockMessage 2)在此期間有定時器,做平/傍 那就是發送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和獲取從 同行
乒乓3)我得到這個乒乓球1)
我認爲這是一個非常簡單和常見的情況,但我沒有找到任何例子,並且 的問題是如何避免幀干擾?
P.S.我使用:4.0.17.Final
你能否介紹一下他們如何幹預? .write(..)旨在處理併發。 –
更新了信息,現在好多了嗎? –
你如何將兩條消息寫入頻道?你是用一次寫電話來寫大信息還是將它分解?您的解碼器是否在多個通道間共享?有幾件事可能會導致這種情況,但是,正如md_5所說,如果你只有兩個單獨的調用來寫,每個消息一個,並且你正在使用TCP,這不應該發生 - ping應該被阻止阻止消息。 – johnstlr