将StringDecoder设置为管道解码器后获取二进制数据

时间:2012-01-09 19:53:32

标签: netty

如果您创建了这样的管道:

    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 / decoder(将其转换为带有原始字节访问的ChannelBuffer)并将字节转换为/从字符串...

1 个答案:

答案 0 :(得分:0)

如果你想获得原始的ChannelBuffer,你需要从管道中删除Decoder,然后一旦你想再次处理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;
    }

}