我试图解析在vb.net中生成的 java中的多个协议缓冲区消息 我正在使用优秀的protobuf-net将多个消息流式传输到java,如下所示: ProtoBuf.Serializer.SerializeWithLengthPrefix(Of Msg)(postStream, msg, ProtoBu
我正在使用优秀的protobuf-net将多个消息流式传输到java,如下所示:
ProtoBuf.Serializer.SerializeWithLengthPrefix(Of Msg)(postStream, msg, ProtoBuf.PrefixStyle.Base128)
在Java中,我使用以下代码来解析消息
final byte[] buffer = new byte[4096]; for (int c = ins.read(buffer); c >= 0; c = ins.read(buffer)) { Msg msg = Msg.parseDelimitedFrom(new ByteArrayInputStream(buffer)); }
问题是在解析第一个消息之后,它会在第二次解析时抛出错误并出现以下错误:
com.google.protobuf.InvalidProtocolBufferException: While parsing a protocol message, the input ended unexpectedly in the middle of a field. This could mean either than the input has been truncated or that an embedded message misreported its own length.
缓冲区大小和邮件大小应该相同吗?如果是,那么我应该如何解析它,特别是对于大型消息.
问题是您需要直接从原始流中读取,而不是一次只读取一个块. (即使你知道每条消息都是4096字节,你也不能确定一次读取那么多)我建议你使用while(stream still open) { Msg msg = Msg.parseDelimitedFrom(ins); }
注意:TCP是流协议,而不是消息协议.您只能保证一次读取一个字节,并且您获得的任何额外字节都是奖励.