首页新闻找找看学习计划

java使用protobuf遇到的问题

0
悬赏园豆:10 [已解决问题] 解决于 2016-09-28 18:32

最近项目开发中有涉及到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);

dbein-lee的主页 dbein-lee | 初学一级 | 园豆:194
提问于:2016-09-26 21:34
< >
分享
最佳答案
0

原因居然是登录认证前没有让服务端设置编码为protobuf,不得不说做二次开发的文档真是不可靠,折腾。

dbein-lee | 初学一级 |园豆:194 | 2016-09-28 18:32
其他回答(1)
0

你看一下《Netty权威指南》第8章, 它上面用了两个Decoder, ProtobufVarint32FrameDecoder和ProtobufDecoder,我没试过,你试一下

收获园豆:10
一剑侵心 | 园豆:281 (菜鸟二级) | 2016-09-27 14:26

Netty的ProtobufDecoder只能设置一个defaultInstance,并且服务端需要的数据包会包含头字节、长度、指令类型和尾字节,所以不能用这个解码器。

支持(0) 反对(0) dbein-lee | 园豆:194 (初学一级) | 2016-09-27 20:27
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册