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
.
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。