2012-11-21 3 views
2

Я создаю службу UDP для andorid. Для ясности части коды скопирован здесь:Разделение пакетов UDP

byte[] message = new byte[1500]; 
    DatagramPacket packet = new DatagramPacket(message, message.length);      
    socket = new DatagramSocket(Constants.LISTENING_PORT_NUMBER); 
    socket.receive(packet); 

Проблема заключается в том, что я получаю UDP пакетов непрерывно. Например, пакет № 1 (длиной 250 байт), пакет № 2 (длиной в 182 байта), пакет № 3 (длина 403 байта) и т. Д.

Мне нужно получить и обработать отдельные UDP-пакеты, которые имеют переменную длина. Согласно спецификации протокола UDP UDP-пакеты имеют границы сообщений. Однако я не нашел решения на Java, которое может разделять UDP-пакеты.

В моем текущем решении я должен определить длину пакета, которую я должен прочитать, но я не знаю длину пакета, прежде чем я его получу.

Я пропустил пункт?


EDIT: Спасибо за как Тобиас и shazin оба правильные ответы. Печально, что я не могу ответить на два вопроса правильно.

socket.receive(packet); будет получать до границы UDP-пакета, последующие пакеты могут быть считаны другим socket.receive(packet);.
Моя проблема заключается в том, что в процессе первого сообщения поступившие дополнительные сообщения не обрабатываются из-за синхронной обработки, теперь я передам обработку сообщений на асинхронную задачу и, надеюсь, смогут своевременно поймать все поступившие пакеты ,

+0

Я считаю, что все, что вы установили, переписывается, когда вы получаете пакет. Держись, пока я не возьму документацию. –

+0

Почему бы вам не использовать udp? tcp имеет последовательность пакетов и сопоставление страхования – njzk2

+0

@ njzk2 потоковые данные в реальном времени, где вы предпочитаете своевременность по надежности. –

ответ

1

Возможно, что-то здесь отсутствует, но DatagramPacket является один пакет, который отправляется. У него есть методы getLength() и getOffset(), необходимые для доступа к данным. Я считаю, что есть также getData(), который возвращает отправленные данные.

У вас есть link Это может помочь вам.

+0

Здравствуйте, конструктор DatagramPacket должен указать параметр длины, поэтому getLength() вернет длину буфера – Sandor

+0

. Это максимальная длина, а не длина пакета. –

+0

Хорошо, что вы правы, моя проблема в том, что последующие пакеты теряются и не обрабатываются приложением из-за синхронной обработки. – Sandor

2

Вы не можете узнать длину пакета перед началом работы. Вы можете определить максимальный граничный байт на основе данных, которые вы можете получить. Рекомендуется использовать массив по 2048 байт.

byte[] message = new byte[2048]; 

Даже если вы имеете переменную длину в входящих пакетов сообщений, вы можете использовать следующий код, чтобы получить

byte[] message = new byte[2048]; 
DatagramPacket packet = new DatagramPacket(message, message.length);      
socket = new DatagramSocket(Constants.LISTENING_PORT_NUMBER); 
socket.receive(packet); 
String data = new String(packet.getData(), 0, packet.getLength()); 

GetData и GetLength методы могут быть использованы для определения размера принятого пакета.

+0

Вы считаете, что смещение равно 0. Я не думаю, что вы можете это сделать. –

+0

@TobiasRitzau, что вы имеете в виду? –

+0

0 в 'new String()' должен быть 'package.getOffset()', правильно? –

Смежные вопросы