2012-01-09 3 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); 
    } 

Канал в основном текст, но иногда мне нужно читать сырой двоичный файл из него. В этом случае msg, входящий в него, является объектом String из-за StringDecoder в конвейере. Я хотел бы получить данные channelbuffer под этой строкой ...

На стороне сервера, данные были записаны с этим:

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

Похоже, я должен отключить stringencoder/декодер (который преобразует его в канал ChannelBuffer w/raw byte access) и преобразует байты в/из строк ...

ответ

0

Если вы хотите получить необработанный ChannelBuffer, вам нужно будет удалить Декодер из конвейера, а затем, как только вы захотите handle String снова просто добавьте его обратно.

Вы также можете расширить 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

Спасибо, Норман. FYI, я действительно избавился от StringDecoder/Encoder и теперь сам обрабатываю буферы каналов. Это было проще в моем случае, потому что мне не нужны специальные функции, специфичные для языка StringDecoder .... – kenyee

 Смежные вопросы

  • Нет связанных вопросов^_^