получение двоичных данных после установки 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);
    }

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

На стороне сервера данные записывались так:

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

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


person kenyee    schedule 09.01.2012    source источник


Ответы (1)


Если вы хотите получить необработанный ChannelBuffer, вам нужно будет удалить декодер из конвейера, а затем, как только вы захотите снова обработать 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;
    }

}
person Norman Maurer    schedule 10.01.2012
comment
Спасибо, Норман. К вашему сведению, я в конечном итоге избавился от StringDecoder/Encoder и теперь сам обрабатываю буферы каналов. В моем случае это было проще, потому что мне не нужны были специальные языковые функции StringDecoder.... - person kenyee; 23.01.2012