2012-10-25 21 views
1

客户端发送1481字节的数组。 服务器可以读取所有1481个字节消息而没有任何问题,但通过解析从接收到的二进制数组给定消息话题我得到这个exeptionGoogle协议缓冲区 - 将C#客户端的消息发送到java服务器

com.google.protobuf.InvalidProtocolBufferException: Protocol message contained an invalid tag (zero).

二进制数据是相同的。我检查了我正在使用正确版本的proto文件。我有点亏本tbh。任何帮助赞赏。

代码

byte [] data= IOUtils.toByteArray(br1, "ASCII"); System.out.println("SIZE:" + data.length);
AddressBook adb1 = AddressBook.parseFrom(data); System.out.println("Server: Addressbook:" + adb1.getPersonCount()); System.out.println("Server: Addressbook:" + adb1.getPerson(0).getName());

问:

我需要找到一种方法,从读1481个字节ARRY正确解析接收Adressbook味精。

谢谢。

+0

你的意思是1481个字节,而不是位,右边有同样的错误?当你说“二进制数据是相同的” - 就像什么?很难跟随这里发生的事情。 –

+0

我的意思是byteArray的长度是1481. – Kaiser4you

+0

没错。了解字节和位之间的差异并使用正确的术语很重要。问题的其余部分仍然模糊。 –

回答

2

这就是问题所在:

br1 = new InputStreamReader(s.getInputStream()); 

这是试图把不透明的二进制数据作为文本。这不是文字,而是二进制数据。所以当你将Reader转换成字节数组时,你已经失去了原始数据的负载 - 难怪这是一个无效的协议缓冲区。

只需使用:

AddressBook adb1 = AddressBook.parseFrom(s.getInputStream()); 

,避免有损文本转换。假设你没有在C#方面有同样的问题,当然。

如果你必须去通过文本,你应该在两边使用base64编码。

+0

为什么我失去了一个原始的负载数据如果我将该读取器转换为字节arry?我尝试了你的提议,但我得到了相同的**异常**:'com.google.protobuf.InvalidProtocolBufferException:协议消息包含无效标记(零)' – Kaiser4you

+0

我怎样才能在两侧使用base64编码?谢谢! – Kaiser4you

+1

@ Kaiser4you:不,你不应该使用读卡器**。这就是整个问题。读者是关于*文本*数据。协议缓冲区消息是*二进制*数据。只是不要这样做!如果你绝对必须使用文本,那么你应该只求助于base64--这不太可能。 –

相关问题