2012-01-09 61 views
0

如果您創建管這樣的:得到的二進制數據設置StringDecoder後的管道解碼器

pipeline.addLast("decoder", new StringDecoder()); 
    pipeline.addLast("encoder", new StringEncoder()); 

有沒有辦法從管道通常處理文本得到的原始數據? 我真的很想這樣做:

public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) { 
     // Save data received from the server. 
     Object msg = e.getMessage(); 
     byte[] rawdata = new byte[((ChannelBuffer)msg).readableBytes()]; 
     ((ChannelBuffer)msg).getBytes(0, rawdata); 
     tmpTarFile.write(rawdata); 
    } 

通道主要是文字,但有時我需要閱讀原始二進制出來。 在這種情況下,由於管道中的StringDecoder,進來的msg是一個String對象。我想獲得的數據ChannelBuffer類型該字符串之下......

在服務器端,數據被寫入這一點:

 ChannelBuffer databuffer = ChannelBuffers.buffer(blobstream.size()); 
     databuffer.writeBytes(blobstream.toByteArray()); 
     e.getChannel().write(databuffer); 

貌似我不得不關掉stringencoder /解碼器(它將其轉換爲ChannelBuffer(帶有原始字節訪問)並將字節轉換爲字符串/從字符串中轉換字節...

回答

0

如果要獲取原始ChannelBuffer,則需要從管道中刪除解碼器,然後一旦想要處理字符串的再次只是將其添加回來。

你也可以擴展StringDecoder,並根據一些邏輯解碼或不解碼。 類似的東西:

public class FlexibleStringDecoder extends StringDecoder { 

    @Override 
    protected Object decode(ChannelHandlerContext ctx, Channel channel, Object msg) throws Exception { 
     if (decodeToString(msg)) { 
      return super.decode(ctx, channel, msg); 
     } 
     return msg; 
    } 

    public boolean decodeToString(Object msg) { 
     // Add some logic here.... 
     return true; 
    } 

} 
+0

謝謝,諾曼。僅供參考,我最終擺脫了StringDecoder/Encoder,現在自己處理通道緩衝區。在我的情況下更容易,因爲我不需要StringDecoder的特殊語言特性.... – kenyee 2012-01-23 17:10:11