netty 中使用 Protobuf

private class ChildChannelHandler extends ChannelInitializer<SocketChannel> {
        @Override
        protected void initChannel(SocketChannel ch) {
            ch.pipeline().addLast("protobufFrameDecoder", new ProtobufVarint32FrameDecoder());

            ch.pipeline().addLast("protobuf decoder", new ProtobufDecoder(SubscribeReqPeoro.SubscribeReq.getDefaultInstance()));

            ch.pipeline().addLast("LengthFieldPrepender", new ProtobufVarint32LengthFieldPrepender());
            ch.pipeline().addLast("protobuf encoder", new ProtobufEncoder());

            ch.pipeline().addLast(new TimeServerHandler());
        }
    }

ChannelPipeline 添加 ProtobufVarint32FrameDecoder, 主要用于半包处理, 后续添加 ProtobufDecoder 解码器, 它的参数是 com.google.protobuf.MessageLite 实际上就是告诉 ProtobufDecoder 需要解码的目标类是什么.

ProtobufVarint32LengthFieldPrepender: 因为 ProtobufEncoder 只是将 message 的各个 filed 按照规则输出, 并没有 serializedSize, 所以 socket 无法判定 package(封包). 这个 Encoder 的作用就是在 ProtobufEncoder 生成的字节数组前, 设置 varint32 数字, 表示 serializedSize.

相关推荐