客户端发送一个 1481 字节的数组。 服务器可以毫无问题地读取所有 1481 字节的消息,但是通过从接收到的二进制数组解析给定的消息,我得到了这个异常(exception):
com.google.protobuf.InvalidProtocolBufferException: Protocol message contained an invalid tag (zero).
二进制数据是相同的。我检查了我使用的原始文件版本是否正确。我有点不知所措。任何帮助表示赞赏。
代码
byte [] data= IOUtils.toByteArray(br1, "ASCII");
System.out.println("SIZE:" + data.length);<br/>
AddressBook adb1 = AddressBook.parseFrom(data); System.out.println("Server: Addressbook:" + adb1.getPersonCount()); System.out.println("Server: Addressbook:" + adb1.getPerson(0).getName());
问题:
我需要找到一种方法来正确解析从读取的 1481 字节 arry 中接收到的 Adressbook 消息。
谢谢。
最佳答案
这就是问题:
br1 = new InputStreamReader(s.getInputStream());
这是试图将不透明的二进制数据视为文本。它不是文本,而是二进制数据。因此,当您将该 Reader
转换为字节数组时,您已经丢失了原始数据的负载 - 难怪它是无效的 Protocol Buffer 。
只需使用:
AddressBook adb1 = AddressBook.parseFrom(s.getInputStream());
并避免有损文本转换。当然,这是假设您在 C# 方面没有遇到同样的问题。
如果您必须通过文本进行访问,则应在两侧使用 Base64 编码。
关于c# - Google Protocol Buffer - 将消息从 C# 客户端发送到 java 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13068767/