2011-07-05 31 views
0

我認爲我是netty的新手;我正在嘗試創建一個客戶端到外部服務器,此服務器輸出消息以0x0d終止,所以我決定使用DelimiterBasedFrameDecoder來處理這些消息。DelimiterBasedFrameDecoder,它是如何工作的?

這只是一個處理程序的測試:

public class TestHandler extends DelimiterBasedFrameDecoder { 

    public TestHandler(){ 

     super(200, true, ChannelBuffers.wrappedBuffer(new byte[] { 0x0d })); 

    } 

    @Override 
    protected Object decode(ChannelHandlerContext ctx, Channel ch, 
      ChannelBuffer cbuf) throws Exception { 


     ByteBuffer buf = ByteBuffer.allocate(cbuf.readableBytes()); 

     cbuf.readBytes(buf); 

     byte[] data = buf.array(); 

     for(byte b : data){ 

      System.out.print(b + " "); 

     } 

     System.out.println(); 

      ...... (some other code) 

    } 

我看到這個錯誤是,當我在構造函數中指定它不會刪除分隔符;在byte []數據的末尾,我總是有0x0d; 因此,正如測試,我改變了分隔符在構造函數中穿上它的測試值將0x55一樣

super(200, true, ChannelBuffers.wrappedBuffer(new byte[] { 0x55 })); 

和它相同的方式工作,沒有區別與以前。 我想我以錯誤的方式使用它,或者我以錯誤的方式讀取數據。 什麼是正確的方式來使用這個類?

要清楚的是,在這個處理程序的真實代碼中,我從讀取的數據創建一個對象,然後從decode()方法返回這個對象,然後我有另一個處理程序來擴展SimpleChannelHandler來獲取這個對象(它是類似於用戶指南中的示例)。

感謝您的幫助 再見

回答

0

我覺得你的解碼方法不使用構造的「stripBytes」部分正確。

如果您查看Netty的DelimiterBasedFrameDecoder中的代碼,您將看到以下代碼中的條件(在您的重寫解碼方法中缺少該條件)。這導致字節不被剝離。

if (stripDelimiter) { 
      frame = buffer.readBytes(minFrameLength); 
      buffer.skipBytes(minDelimLength); 
     } else { 
      frame = buffer.readBytes(minFrameLength + minDelimLength); 
     } 
相關問題