乐趣区

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.

退出移动版