получить дейтаграммпакет

В классе DatagramPacket все конструкторы требуют параметра int как «длина». Зачем мне устанавливать длину DatagramPacket, когда я пытаюсь его получить, ведь я не всегда знаю, какой длины пакет? И какой номер мне установить?

edit: Позвольте мне изменить свой вопрос на это:

если метод DatagramSocket.receive имеет сигнатуру

public DatagramPacket receive() {};

вместо

public void receive(Datagrampacket p) {};

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

Поскольку к UDP часто применяется аналогия со службой доставки, скажем:

DatagramSocket похож на почтовый ящик. DatagramPacket похож на конверт для посылки. DatagramPacket.data — это содержимое внутри конверта. Для службы доставки получатель предоставляет почтовый ящик, а не конверт.


person Fermat's Little Student    schedule 01.03.2013    source источник
comment
Ваше редактирование вводит в заблуждение. Пример заменяет вопрос, зачем нам нужно дублировать datagram.buffer.length на datagram.length в пакете Datagrampacket? с тем, почему нам нужно предоставить буфер в первую очередь. Это два разных вопроса. И непонятно, о чем вы сейчас спрашиваете.   -  person Val    schedule 02.03.2013


Ответы (1)


Ну, вы просите его записать в массив байтов, который вы также предоставляете. Поэтому убедитесь, что ваш массив байтов такой же большой, как самый большой пакет, который вы ожидаете обработать, и передайте длину массива для параметра length.

РЕДАКТИРОВАТЬ: Для отредактированного вопроса этот API будет означать, что принимающий код должен каждый раз создавать новый буфер. С существующим API один и тот же массив байтов может использоваться для нескольких вызовов, потому что вызывающая сторона решает, когда он закончит его использовать.

Теперь, по общему признанию, имело бы смысл иметь такую ​​​​перегрузку:

public DatagramPacket(byte[] buffer)
{
    this(buffer, buffer.length);
}

... но это другое дело.

person Jon Skeet    schedule 01.03.2013
comment
Это вопрос на самом деле. Почему вы должны указать длину массива в программе Java? Это принцип ПОЦЕЛУЯ Оккама? - person Val; 01.03.2013
comment
@Val: это позволяет вам повторно использовать один и тот же буфер для всех операций чтения, что более эффективно, чем код-получатель, создающий каждый раз новый массив байтов. Конечно, он, вероятно, также имитирует родной интерфейс... - person Jon Skeet; 01.03.2013
comment
Нет. Буфер используется повторно, когда вы предоставляете его снова и снова. Предоставление длины не делает его более многоразовым. - person Val; 01.03.2013
comment
@Val: Ты меня неправильно понял. Какова альтернатива клиенту, предоставляющему буфер? Пакет может создать свой собственный, но тогда он не сможет его использовать повторно. Если клиент предоставляет буфер, его можно использовать повторно. Теперь да, легко может быть перегрузка, которая просто делегирует с помощью свойства length, но имеет смысл, по крайней мере, иметь возможность ограничить длину (и смещение), в которую записывается. - person Jon Skeet; 02.03.2013