boy-learning-netty | 09 Netty 对常

2019-10-17  本文已影响0人  BruceOuyang

相关源码:boy-learning-netty
个人博客:http://bruce.bugmakers.club
内容来自《极客时间 - Netty源码剖析与实战》

Netty 对常用编解码的支持

为什么需要 “二次” 解码

假设我们把解决粘包、半包问题的常见三种解码器叫一次解码器,那么,我们在项目中,除了可选的压缩解压缩之外,还需要一层解码,因为一次解码的结果是字节,需要和项目中所使用的的对象做转化,方便使用,这层解码器可以称为“二次解码器”,相应的,对应的编码器是为了将 Java 对象转化为字节流方便存储或传输。

一次解码器的结果是字节,二次解码器的结果是对象

思考:是不是可以一步到位?合并一次解码(解决粘包、半包)和二次解码(解决可操作性问题)

可以,但是不建议

常用的 “二次” 编解码方式

选择编解码方式的要点

Protobuf 简介与使用

简介

使用

protoc.exe --java_out=. demo.proto
protoc.exe --python_out=. demo.proto
protoc.exe --cpp_out=. demo.proto

源码解读:Netty 对常用编解码的支持

// 参考源代码:WorldClockClientInitializer.java
public void initChannel(SocketChannel ch) {
    ChannelPipeline p = ch.pipeline();
    if (sslCtx != null) {
        p.addLast(sslCtx.newHandler(ch.alloc(), WorldClockClient.HOST, WorldClockClient.PORT));
    }
    // varint 为可变长度
    p.addLast(new ProtobufVarint32FrameDecoder());
    p.addLast(new ProtobufDecoder(WorldClockProtocol.LocalTimes.getDefaultInstance()));

    p.addLast(new ProtobufVarint32LengthFieldPrepender());
    p.addLast(new ProtobufEncoder());

    p.addLast(new WorldClockClientHandler());
}
上一篇下一篇

猜你喜欢

热点阅读