получение двоичных данных после установки StringDecoder в качестве конвейерного декодера - PullRequest
0 голосов
/ 09 января 2012

Если вы создали свою трубу так:

    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 с необработанным байтовым доступом) и конвертировать байты в / из строк ...

1 Ответ

0 голосов
/ 10 января 2012

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

}
...