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
.
相关推荐
Erick 2020-11-17
Charlesbases 2020-10-23
Erick 2020-08-21
Erick 2020-06-17
Erick 2020-06-17
mitesi 2020-06-07
Charlesbases 2020-06-07
zagnix 2020-06-04
小小书童 2020-05-20
gumingyaotangwei 2020-05-17
极品小肥羊 2020-04-23
极品小肥羊 2020-04-20
Charlesbases 2020-04-16
mitesi 2020-04-07
higher0 2020-03-09
Erick 2020-03-08
Erick 2020-02-03
Erick 2020-02-03