将几个 DatagramPackets 重新组合成一个 byte[]

Recombining several DatagramPackets into a single byte[]

前言:我一点经验都没有,可能犯过愚蠢的错误。请纠正这些错误并教我如何变得更好而不是因为我无知而责备我,如果我没有因为我缺乏知识而感到谦卑,我就不需要寻求帮助。我在互联网上搜索了解决方案,但也许我选择了所有错误的关键字。

我必须使用 UDP 而不是 TCP(太长无法解释)并且我需要从客户端向服务器发送一个大字节[],它不适合单个 DatagramPacket。因此,我决定在创建我的 DatagramPackets

之前将 byte[] 分成不超过 1024 的块

问题:一旦服务器收到数据包,它们当然是乱序的。我需要一种方法将可变数量的 DatagramPackets 重新 assemble 变回单个字节[]

我的计划:创建一个新的 byte[],其中包含关于上述 DatagramPacket 中每个 byte[] 的元数据(例如拆分后的总数据包、特定数据包的位置、数据包组 UUID)并将其添加到每个数据报包中。

byte[] (UUID idOfPacket + int positionOfPacket + int numberOfPackets) + byte[] data(not actual code just so you get an idea of how I want to arrange the byte[] incase my description was bad)

因为我不知道如何确定元数据何时结束以及原始数据包数据何时开始,我想我可以使用设置字节长度的元数据,这样我就可以始终在服务器上的某个点拆分并重新组合基于元数据中的信息。

问题:这似乎是个坏主意,因为一旦部署,我将永远无法调整元数据的格式。有没有更好的方法来解决这个问题?

你的想法不错。许多协议都使用它。您可以提供足够的字节以应对最坏的情况。

例如:

idOfPacket:  16 bytes (128 bits)
positionOfPacket:  4 bytes (4294967296)
numberOfPackets:  4 bytes (4294967296)

或者你可以做的是用一个字节(或多个字节)(我们称之为大小字节)来告诉你这些字段有多长(以字节为单位)。但这要难得多。

sizeOfId:  1 byte (value would be 16 for this example)
sizeOfNumberOfPackets: 1 byte (value would be 4 for this example)
idOfPacket:  16 bytes (128 bits)
positionOfPacket:  4 bytes (4294967296)
numberOfPackets:  4 bytes (4294967296)