Google协议缓冲区将消息从C#客户端发送到java服务器

Google协议缓冲区将消息从C#客户端发送到java服务器,c#,java,stream,network-programming,protocol-buffers,C#,Java,Stream,Network Programming,Protocol Buffers,客户端发送一个1481字节的数组。 服务器可以毫无问题地读取所有1481字节的消息,但是通过解析接收到的二进制数组中的给定消息,我得到了这个例外项: com.google.protobuf.InvalidProtocolBufferException:协议消息包含无效标记(零)。 二进制数据是相同的。我检查了我使用的原型文件的正确版本。我有点不知所措。谢谢你的帮助 代码 byte[]data=IOUtils.toByteArray(br1,“ASCII”); System.out.print

客户端发送一个1481字节的数组。 服务器可以毫无问题地读取所有1481字节的消息,但是通过解析接收到的二进制数组中的给定消息,我得到了这个例外项


com.google.protobuf.InvalidProtocolBufferException:协议消息包含无效标记(零)。

二进制数据是相同的。我检查了我使用的原型文件的正确版本。我有点不知所措。谢谢你的帮助

代码

byte[]data=IOUtils.toByteArray(br1,“ASCII”);
System.out.println(“大小:“+数据长度”)
AddressBook adb1=AddressBook.parseFrom(数据);System.out.println(“服务器:地址簿:+adb1.getPersonCount());System.out.println(“服务器:地址簿:+adb1.getPerson(0.getName())

问题:

我需要找到一种方法来正确解析从读取的1481字节数组接收到的AddressBook msg

谢谢。

这就是问题所在:

br1 = new InputStreamReader(s.getInputStream());
这是试图将不透明的二进制数据视为文本。它不是文本,而是二进制数据。所以,当您将
读取器
转换为字节数组时,您已经丢失了大量原始数据——难怪它是一个无效的协议缓冲区

只需使用:

AddressBook adb1 = AddressBook.parseFrom(s.getInputStream());
并避免有损文本转换。当然,这是假设你没有在C#端得到同样的破坏


如果必须通过文本,则应在两侧使用base64编码。

现在它可以工作了,我犯了同样的错误,协议缓冲区消息

您的意思是1481字节,而不是位,对吗?当你说“二进制数据是一样的”-和什么一样?很难理解这里到底发生了什么我是说byteArray的长度是1481。了解字节和位之间的差异并使用正确的术语很重要。问题的其余部分仍然模糊。接收的二进制数据与发送的数据相同问题所有虽然接收的二进制数据与发送的数据相同,但我得到此异常:com.google.protobuf.InvalidProtocolBufferException:协议消息包含无效标记(零).若我将读卡器转换为字节数组,为什么会丢失大量原始数据?我尝试了你的建议,但我得到了相同的例外:
com.google.protobuf.InvalidProtocolBufferException:协议消息包含无效标记(零)
如何在两侧使用base64编码?谢谢@Kaiser4you:不,你根本不应该使用阅读器。这就是重点。读者关注的是文本数据。协议缓冲区消息是二进制数据。别这样!如果您必须使用文本,则只应使用base64,这是不可能的。谢谢!确定在这种情况下最好使用哪个I/O蒸汽:BuffredInputStream或DataInputStream或ObjectInputStream?@Kaiser4you:除非您使用的是
DataInputStream
ObjectInputStream
提供的任何功能,否则不要使用它们。您甚至可能不需要使用
BufferedInputStream
,因为Protobuf实现的IIRC执行缓冲。按照我的回答,只需使用
s.getInputStream()