一、编码解码

    • 编写网络应用程序时,因为数据在网络中传输的都是二进制字节码数据,在发送数据时就需要编码,接收数据时就需要解码
    • codec(编解码器) 的组成部分有两个:decoder(解码器)和 encoder(编码器)。encoder 负责把业务数据转换成字节码数据,decoder 负责把字节码数据转换成业务数据 image.png- Netty 自身提供了一些 codec(编解码器)
    • Netty 提供的编码器 StringEncoder,对字符串数据进行编码 ObjectEncoder,对 Java 对象进行编码 …
    • Netty 提供的解码器 StringDecoder, 对字符串数据进行解码 ObjectDecoder,对 Java 对象进行解码 …
    • Netty 本身自带的 ObjectDecoder 和 ObjectEncoder 可以用来实现 POJO 对象或各种业务对象的编码和解码,底层使用的仍是 Java 序列化技术 , 而Java 序列化技术本身效率就不高,存在如下问题 无法跨语言 序列化后的体积太大,是二进制编码的 5 倍多。
    • 序列化性能太低 => 引出 新的解决方案 [Google 的 Protobuf]

    image.png
    image.png


    二、Protobuf快速入门实例 **

    • 编写程序,使用Protobuf完成如下功能 :

    客户端可以发送一个Student PoJo 对象到服务器 (通过 Protobuf 编码)
    服务端能接收Student PoJo 对象,并显示信息(通过 Protobuf 解码)
    引入相关依赖:
    image.png
    新建文件Student.proto,在这里会提示要安装一下相关插件:
    image.png
    将文件保存后,复制粘贴到:
    image.png
    如图生成一个StudentPOJO文件:
    image.png
    将文件拷贝到项目中:image.png
    此时有提示错误,需要改一下项目编译版本:
    image.png
    image.png
    发送一个student对象到服务器:
    image.png
    在客户端pipeline中加入ProtoBufEncoder:
    image.png
    在服务端pipeline中加入ProtoBufDecoder:
    image.png
    读取从客户端发送的StudentPOJO.Student:
    image.png
    运行客户端和服务器后出现了如下的错误:
    image.png
    image.png
    解决方法:
    image.png
    运行结果:
    image.png
    image.png

    • 编写程序,使用Protobuf完成如下功能

    客户端可以随机发送Student PoJo/ Worker PoJo 对象到服务器 (通过 Protobuf 编码)
    服务端能接收Student PoJo/ Worker PoJo 对象(需要判断是哪种类型),并显示信息(通过 Protobuf 解码)
    image.png
    image.png
    image.png

    三、解码器-ByteToMessageDecoder

    • 关系继承图

    image.png

    • 由于不可能知道远程节点是否会一次性发送一个完整的信息,tcp有可能出现粘包拆包的问题,这个类会对入站数据进行缓冲,直到它准备好被处理。
    • 一个关于ByteToMessageDecoder实例分析

    image.png
    image.png

    • Netty的handler链的调用机制

    实例要求:
    使用自定义的编码器和解码器来说明Netty的handler 调用机制
    客户端发送long -> 服务器
    服务端发送long -> 客户端

    • 客户端发送给服务器

    image.png
    image.png
    image.png
    image.png
    image.png
    运行结果:
    image.png
    image.png
    修改发送的数据:
    image.png
    image.png
    image.png

    • 服务器发送给客户端

    image.png
    image.png
    image.png
    运行结果:
    image.pngimage.png