Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java协议缓冲区-消息大小_Java_Protocol Buffers - Fatal编程技术网

Java协议缓冲区-消息大小

Java协议缓冲区-消息大小,java,protocol-buffers,Java,Protocol Buffers,所以,在过去的几周里,我一直在学习非常简单的网络编程和协议缓冲区。现在,我有一个Java客户机和一个C#服务器,它们使用协议缓冲区来回通信。这一切都可以正常工作,但为了使它在客户端(Java)上工作,我必须使用传入消息的确切大小创建字节数组,否则解析器将抛出错误“协议消息包含无效标记(零)” 在做了一些研究之后,我发现我为DatagramPacket创建的数组(1024字节)有大量的尾随零(因为我从服务器传入的数据是27字节长),这就是为什么我现在,如前所述,必须使用传入数据的确切大小创建数组

所以,在过去的几周里,我一直在学习非常简单的网络编程和协议缓冲区。现在,我有一个Java客户机和一个C#服务器,它们使用协议缓冲区来回通信。这一切都可以正常工作,但为了使它在客户端(Java)上工作,我必须使用传入消息的确切大小创建字节数组,否则解析器将抛出错误“协议消息包含无效标记(零)”

在做了一些研究之后,我发现我为DatagramPacket创建的数组(1024字节)有大量的尾随零(因为我从服务器传入的数据是27字节长),这就是为什么我现在,如前所述,必须使用传入数据的确切大小创建数组

至于这个问题,有没有办法找出我的.proto文件中所有proto“消息”的大小?如果没有某种类型的静态getSize(),是否有一种方法可以通过“消息”中的字段类型来计算它


我现在使用的消息包含3个双字节,现在我正在考虑它,但我想从知道发生了什么的人那里得到一个肯定的答案,是不是27,因为每个消息字段上的每个双字节8字节,每个“标记”1字节?

我相信你的问题在于你的套接字接收代码。有一个带尾零点的数组不是问题,但是在接收时,应该检查接收到的字节数(它是接收调用的返回值),并且只考虑缓冲区数组的字节从开始到“接收字节”。

< P>原始数据中的根对象不是自终止的;它被设计为可追加的(append===merge),因此通常库只是读取,直到数据用完为止。如果您有备用零,它将无法解析下一个字段头。有两种解决方法:

  • 如果您只想发送一条消息,只需关闭消息末尾的出站套接字;客户端应该检测套接字的结尾并进行相应的补偿(注意,除非您使用的是长度有限的流包装器,否则您仍然不希望使用过大的缓冲区)
  • 使用某种“框架”协议;最简单的方法是在每条消息前面加上该消息中的字节数(注意,在一般情况下,该大小不是固定的,但在3个双字节的情况下,每个双字节的字段头的字段号不大于16,则是:将为27个字节);然后,您可以创建适当大小的缓冲区(注意重复的数组分配可能会很昂贵),或者更典型地:使用长度有限的流包装器,或者使用内存流中的内存备份

您可以在发送协议缓冲区消息之前发送长度。