最近项目开发中有涉及到protobuf的模块,详情如下:
待开发的tcp客户端与服务端保持socket长链接,只支持protobuf编码格式的数据包,用的netty4框架,LengthFieldBasedFrameDecoder解码器,为什么没有用自带的protobuf解码器,因为涉及到多个protobuf实例。初始的socket连接建立没有问题,服务端要求的心跳响应也能回复,链路不会断开。但是客户端向服务端发送数据包时,服务端似乎并没有收到,服务端向客户端回传消息时,收到的似乎与预期不相符,并且不能反序列化为对象。
下面是收到服务端回传的消息时处理的代码
ByteBuf buf = (ByteBuf) msg;
int len = buf.readableBytes();
byte[] req = new byte[len];
buf.readBytes(req);
byte[] vct = Arrays.copyOfRange(req, 12, req.length - 1);
VctMessage rsp = VctMessage.parseFrom(vct);
原因居然是登录认证前没有让服务端设置编码为protobuf,不得不说做二次开发的文档真是不可靠,折腾。
你看一下《Netty权威指南》第8章, 它上面用了两个Decoder, ProtobufVarint32FrameDecoder和ProtobufDecoder,我没试过,你试一下
Netty的ProtobufDecoder只能设置一个defaultInstance,并且服务端需要的数据包会包含头字节、长度、指令类型和尾字节,所以不能用这个解码器。