美文网首页
Netty 学习5.编解码框架

Netty 学习5.编解码框架

作者: 李米学 | 来源:发表于2018-04-07 19:24 被阅读0次

    1. 编解码技术

    通常我们也习惯将编码(Encode)称为序列化(serialization),它将对象序列化为字节数组,用于网络传输、数据持久化或者其它用途。

    反之,解码(Decode)/反序列化(deserialization)把从网络、磁盘等读取的字节数组还原成原始对象(通常是原始对象的拷贝),以方便后续的业务逻辑操作。

    2 Netty编解码框架

    2.1 LineBasedFrameDecoder解码器

    LineBasedFrameDecoder是回车换行解码器,如果用户发送的消息以回车换行符作为消息结束的标识,则可以直接使用Netty的 LineBasedFrameDecoder对消息进行解码,只需要在初始化Netty服务端或者客户端时将LineBasedFrameDecoder 正确的添加到ChannelPipeline中即可,不需要自己重新实现一套换行解码器。

    LineBasedFrameDecoder的工作原理是它依次遍历ByteBuf中的可读字节,判断看是否有“\n”或者“\r\n”,如果有,就以此位置为结束位置,从可读索引到结束位置区间的字节就组成了一行。它是以换行符为结束标志的解码器,支持携带结束符或者不携带结束符两种解码方式,同 时支持配置单行的最大长度。如果连续读取到最大长度后仍然没有发现换行符,就会抛出异常,同时忽略掉之前读到的异常码流。防止由于数据报没有携带换行符导 致接收到ByteBuf无限制积压,引起系统内存溢出。

    它的使用效果如下:

    解码之前:
    +-----------------------------------------------------+
    接收到的数据报
    “This is a netty example for using the nio framework.\r\n When you“
    +-----------------------------------------------------+
    解码之后的文本消息
    “This is a netty example for using the nio framework.“
    +------------------------------------------------- ---+

    2.2 DelimiterBasedFrameDecoder解码器

    DelimiterBasedFrameDecoder是分隔符解码器,用户可以指定消息结束的分隔符,它可以自动完成以分隔符作为码流结束标识的消息的解码。回车换行解码器实际上是一种特殊的DelimiterBasedFrameDecoder解码器。

    分隔符的指定:与大家的习惯不同,分隔符并非以char或者string作为构造参数,而是ByteBuf,下面我们就结合实际例子给出它的用法。

    假如消息以“$_”作为分隔符,服务端或者客户端初始化ChannelPipeline的代码实例如下:

    @Override
    public void initChannel(SocketChannel ch)
        throws Exception {
        ByteBuf delimiter = Unpooled.copiedBuffer("$_"
            .getBytes());
       ch.pipeline().addLast(
            new DelimiterBasedFrameDecoder(1024,
                delimiter));
       ch.pipeline().addLast(new StringDecoder());
       ch.pipeline().addLast(new UserServerHandler());
    }
    

    首先将“$_”转换成ByteBuf对象,作为参数构造DelimiterBasedFrameDecoder,将其添加到 ChannelPipeline中,然后依次添加字符串解码器(通常用于文本解码)和用户Handler,请注意解码器和Handler的添加顺序,如果 顺序颠倒,会导致消息解码失败。

    DelimiterBasedFrameDecoder原理分析:解码时,判断当前已经读取的ByteBuf中是否包含分隔符ByteBuf,如果包含,则截取对应的ByteBuf返回。

    2.3 FixedLengthFrameDecoder解码器

    FixedLengthFrameDecoder是固定长度解码器,它能够按照指定的长度对消息进行自动解码,开发者不需要考虑TCP的粘包/拆包等问题,非常实用。

    对于定长消息,如果消息实际长度小于定长,则往往会进行补位操作,它在一定程度上导致了空间和资源的浪费。但是它的优点也是非常明显的,编解码比较简单,因此在实际项目中仍然有一定的应用场景。

    利用FixedLengthFrameDecoder解码器,无论一次接收到多少数据报,它都会按照构造函数中设置的固定长度进行解码,如果是半包消息,FixedLengthFrameDecoder会缓存半包消息并等待下个包到达后进行拼包,直到读取到一个完整的包。

    我的Github项目,欢迎大家指导!Watch!Star!Fork! Thanks!
    GitHub-Netty-demo-server
    GitHub-Netty-demo-client

    相关文章

      网友评论

          本文标题:Netty 学习5.编解码框架

          本文链接:https://www.haomeiwen.com/subject/hlxkhftx.html