2014-07-08 61 views
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

+0

你能否介紹一下他們如何幹預? .write(..)旨在處理併發。 –

+0

更新了信息,現在好多了嗎? –

+0

你如何將兩條消息寫入頻道?你是用一次寫電話來寫大信息還是將它分解?您的解碼器是否在多個通道間共享?有幾件事可能會導致這種情況,但是,正如md_5所說,如果你只有兩個單獨的調用來寫,每個消息一個,並且你正在使用TCP,這不應該發生 - ping應該被阻止阻止消息。 – johnstlr

回答

0

我已經發現一個根本原因和解決方案這樣的:

(問題)當大消息到達它被構造成一個消息 出的字節流分組。在此期間,在該頻道上不應該詢問其他任何消息 ,即使小的ping/pong也會干擾 並將損壞的數據插入到結構中。

爲了不干擾(溶液)中,我使用的消息的隊列順序 並且僅當完整的消息被 接收的下一個往返行程被調用時,它是否是一個 平/乒乓或另一個請求/響應。