2010-05-22 75 views
0
public class CustomProtocolDecoder extends CumulativeProtocolDecoder{ 
byte currentCmd = -1; 
int currentSize = -1; 
boolean isFirst = false; 
@Override 
protected boolean doDecode(IoSession is, ByteBuffer bb, ProtocolDecoderOutput pdo) throws Exception { 
     if(currentCmd == -1) 
     { 
      currentCmd = bb.get(); 
      currentSize = Packet.getSize(currentCmd); 
      isFirst = true; 
     } 
     while(bb.remaining() > 0) 
     { 
      if(!isFirst) 
      { 
       currentCmd = bb.get(); 
       currentSize = Packet.getSize(currentCmd); 
      } 
      else 
       isFirst = false; 
      //System.err.println(currentCmd + " " + bb.remaining() + " " + currentSize); 
      if(bb.remaining() >= currentSize - 1) 
      { 
       Packet p = PacketDecoder.decodePacket(bb, currentCmd); 
       pdo.write(p); 
      } 
      else 
      { 
       bb.flip(); 
       return false; 
      } 
     } 
     if(bb.remaining() == 0) 
      return true; 
     else 
      return false; 
} 

}這是在MINA中編寫ProtocolDecoder的正確方法嗎?

任何人看到什麼毛病此代碼?當一次接收到大量數據包時,即使只連接了一個客戶端,其中一個數據包可能會在最後被切斷(例如12個字節,而不是15個字節),這顯然很糟糕。

回答

1

我發現有點難以理解你在這裏嘗試解碼的協議。這是肯定看起來有點困惑在那裏;)

你寫的東西,期望在同一連接上的許多請求?如果是這樣,那麼很好,這就是米娜的擅長...

通常,我希望MINA解碼器檢查它是否有一個完整的消息,然後,如果沒有,將IoBuffer的指針返回到它在方法開始時保持的位置。

正常情況下,完整的消息將由定界符或消息開始處的長度字段確定。

api文檔中提供的示例非常好。 它尋找回車+換行分隔符:

http://mina.apache.org/report/trunk/apidocs/org/apache/mina/filter/codec/CumulativeProtocolDecoder.html

心連心

0

從例如一些幫助想通了 - 我有真假混淆,並沒有意識到我應該跟蹤輸入緩衝區的位置。最重要的是,我不知道我不需要while循環。謝謝!

protected boolean doDecode(IoSession is, ByteBuffer bb, ProtocolDecoderOutput pdo) throws Exception { 
    int start = bb.position(); 
    currentCmd = bb.get(); 
    currentSize = Packet.getSize(currentCmd); 
    //System.err.println(currentCmd + " " + bb.remaining() + " " + currentSize); 
    if(bb.remaining() >= currentSize - 1) 
    { 
     Packet p = PacketDecoder.decodePacket(bb, currentCmd); 
     pdo.write(p); 
     if(bb.remaining() == 0) 
      return false; 
     else 
      return true; 
    } 
    else 
    { 
     bb.position(start); 
     return false; 
    } 
} 
相關問題