【问题标题】:Recombining several DatagramPackets into a single byte[]将几个 DatagramPackets 重新组合成一个字节[]
【发布时间】:2015-04-13 12:47:28
【问题描述】:

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

我必须使用 UDP 而不是 TCP(解释太长),我需要从客户端向服务器发送一个大字节 [],这不适合单个 DatagramPacket。因此,我决定在创建我的 DatagramPackets 之前将 byte[] 分成不超过 1024 个的块

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

我的计划: 创建一个新的 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)

因为我不知道如何确定元数据何时结束以及原始数据包数据何时开始,所以我认为我可以使用设定字节长度的元数据,因此我总是可以在服务器上的某个点拆分并根据来自元数据的信息。

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

【问题讨论】:

    标签: java udp bytearray datagram


    【解决方案1】:

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

    例如:

    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)
    

    【讨论】:

      猜你喜欢
      • 2013-04-19
      • 2022-06-17
      • 1970-01-01
      • 1970-01-01
      • 2011-07-31
      • 1970-01-01
      • 2021-01-30
      • 2018-11-14
      • 2010-10-25
      相关资源
      最近更新 更多