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