【问题标题】:Netty - Best way to transmit strings with line breaks?Netty - 用换行符传输字符串的最佳方式?
【发布时间】:2015-05-06 00:15:41
【问题描述】:

我正在研究一种协议,该协议使用 DelimiterBasedFrameDecoder 进行解码,只要收到换行符就会拆分 bytebuf。

不幸的是,必须有可能传输带有换行符的字符串。现在,解码器读取字符串中的换行符并相应地创建帧。

我的想法是使用 Base64 对这些字符串进行编码,并在帧解码器完成工作后对其进行解码。我现在的问题是,这个问题有更好的解决方案吗? Base64 带来了开销以及额外的编码/解码工作。

无法使用另一个分隔符,因为我的协议的标头字段需要它。

【问题讨论】:

    标签: java netty decode encode


    【解决方案1】:

    在您的管道中为此使用基于NUL 分隔符的帧解码器和编码器。分隔符文档是here。例如,在解码器管道中添加以下内容。

    pipeline.addLast("framer", new DelimiterBasedFrameDecoder(8192, Delimiters.nulDelimiter()));
    

    在编码时应该使用相同的,例如

    @Sharable
    public class NulEncoder extends OneToOneEncoder {
    
    @Override
    protected Object encode(ChannelHandlerContext ctx, Channel channel,
            Object msg) throws Exception {
        ChannelBuffer buffer = ChannelBuffers.wrappedBuffer((ChannelBuffer)msg, Delimiters.nulDelimiter());
        return buffer;
    }
    }
    

    【讨论】:

    • 嘿,谢谢您的回答!与此同时,我想出了另一个解决方案。当我收到请求/响应的整个标头并添加FixedLengthFrameDecoder 时,我只是从管道中删除了帧解码器,如下所示,解码器不会拆分每个换行符,它现在会在字节数与新的长度相同时拆分接收到帧解码器。
    • 是的,如果您传输二进制文件,这是一个很好的方法。如果您要传输字符串,那么 NUL 可能是更好的选择。
    • 您好,8192 码有什么意义吗?我在几个地方看到过这种情况,但不明白为什么。
    • 8kb 或数据,除了防止有人向您发送大量数据的拒绝攻击外,我不记得它有任何意义。也许我记不太清楚..:)
    猜你喜欢
    • 2013-04-09
    • 2011-10-16
    • 1970-01-01
    • 2015-12-18
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多