场景是这样的,服务端是netty,所有消息采用protobuf封装
//handler
ChannelPipeline pipeline = ch.pipeline();
pipeline.addLast(new IdleStateHandler(0, 0, 60, TimeUnit.SECONDS)); //1
pipeline.addLast(new HeartbeatHandler());
// ----Protobuf处理器,这里的配置是关键----
pipeline.addLast("frameDecoder", new ProtobufVarint32FrameDecoder());
//配置Protobuf解码处理器,消息接收到了就会自动解码,ProtobufDecoder是netty自带的,Message是自己定义的Protobuf类
pipeline.addLast("protobufDecoder",
new ProtobufDecoder(FFCallSigOuterClass.Sig.getDefaultInstance()));
pipeline.addLast(new FFCallServerHandler()); //自己的业务处理
// 用于在序列化的字节数组前加上一个简单的包头,只包含序列化的字节长度。
pipeline.addLast("frameEncoder",
new ProtobufVarint32LengthFieldPrepender());
//配置Protobuf编码器,发送的消息会先经过编码
pipeline.addLast("protobufEncoder", new ProtobufEncoder());
// ----Protobuf处理器END----
此时如果客户端也是netty,那么通讯没有问题,但如果是非java语言,那么如果直接发送/接受protobuf序列化后的二进制包,会报以下异常:
io.netty.handler.codec.DecoderException: com.google.protobuf.InvalidProtocolBufferException: Protocol message contained an invalid tag (zero).
经过一阵子百度谷歌(毕竟 copy & paste engineer),原因是服务端采用了
pipeline.addLast("frameD