Рекомбинация нескольких DatagramPackets в один байт[]

Предисловие: у меня совсем НЕТ опыта и, вероятно, я совершал глупые ошибки. Пожалуйста, исправьте эти ошибки и научите меня, как быть лучше, вместо того, чтобы ругать меня за невежество, если бы я уже не был унижен своим недостатком знаний, мне не нужно было бы просить о помощи. Я искал в Интернете решение, но, возможно, я выбираю все неправильные ключевые слова.

Я должен использовать UDP, а не TCP (слишком долго объяснять), и мне нужно отправить большой byte[] от клиента к серверу, который не поместится в один DatagramPacket. Поэтому я решил разбить byte[] на куски не длиннее 1024, прежде чем создавать свои DatagramPackets.

Проблема: как только сервер получает пакеты, они, конечно же, не в порядке. Мне нужен способ пересобрать переменное количество DatagramPackets обратно в один байт []

Мой план: создать новый байт[] с метаданными о каждом байте[] в вышеуказанном пакете дейтаграмм (например, общее количество пакетов после разделения, положение конкретного пакета, 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)

Поскольку я понятия не имею, как определить, когда заканчиваются метаданные и начинаются исходные данные пакета, я подумал, что могу использовать метаданные, которые представляют собой заданную длину байтов, чтобы я всегда мог разделить в определенной точке на сервере и рекомбинировать на основе информации из метаданных .

Вопрос. Это кажется плохой идеей, потому что после развертывания я никогда не смогу настроить формат метаданных. Есть ли лучший способ приблизиться к этому?


person RoboLam    schedule 12.02.2015    source источник


Ответы (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)
person Jose Martinez    schedule 12.02.2015