c# - Google Protocol Buffer - 将消息从 C# 客户端发送到 java 服务器

标签 c# java stream network-programming protocol-buffers

客户端发送一个 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/

相关文章:

c# - .net 6 属性路由返回 404

Java-如何在 JTable 上动态初始化行?

java - 如何生成多个圆形并使这些形状沿着框架向下移动

node.js - pipe()后 'finish'上的nodejs空文件

java - 在 Java 中连接到 LDAP Active Directory,无需用户名和密码

c# - 如何列出 list

c# - 在WiX安装中从C#自定义操作调用PowerShell命令

java - 使用 JFileChooser - 访问所选文件

c++ - 无法在Linux上使用流打印文件

c# - 使用 Stream writer 将特定字节写入文本文件