【问题标题】:getting binary data after you set StringDecoder as pipeline decoder将 StringDecoder 设置为管道解码器后获取二进制数据
【发布时间】:2012-01-10 22:51:39
【问题描述】:

如果您像这样创建管道:

    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 databuffer = ChannelBuffers.buffer(blobstream.size());
        databuffer.writeBytes(blobstream.toByteArray());
        e.getChannel().write(databuffer);

看起来我必须关闭字符串编码器/解码器(将其转换为具有原始字节访问权限的 ChannelBuffer)并将字节转换为字符串或从字符串转换...

【问题讨论】:

    标签: netty


    【解决方案1】:

    如果您想获取原始 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;
        }
    
    }
    

    【讨论】:

    • 谢谢,诺曼。仅供参考,我最终摆脱了 StringDecoder/Encoder,现在自己处理通道缓冲区。在我的情况下更容易,因为我不需要 StringDecoder 的特殊语言特定功能......
    猜你喜欢
    • 1970-01-01
    • 2017-07-14
    • 1970-01-01
    • 2010-09-09
    • 2018-12-14
    • 2014-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多