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.socket

相关文章
相关标签/搜索