Используя NIO DatagramChannel, нужно ли мне будет обрабатывать частично прочитанные / записанные пакеты?

StackOverflow https://stackoverflow.com/questions/707351

  •  22-08-2019
  •  | 
  •  

Вопрос

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

У меня есть ноющее подозрение, что это может не понадобиться при использовании DatagramChannel, но информации мало.

Что это за история?

Должен ли я вызывать (неблокирующий) receive (ByteBuffer) повторно, пока не получу null обратно, чтобы прочитать все ожидающие дейтаграммы?

При отправке в неблокирующем режиме могу ли я полагаться на send (ByteBuffer, SocketAddress) для отправки всего буфера или отклонения его полностью, или мне нужно, возможно, сохранить частично записанные буферы?

Это было полезно?

Решение

Каждое считывание дейтаграммы - это вся дейтаграмма целиком, ни больше, ни меньше.В описании java.nio.DatagramChannel.read есть намек на то, что это так:

Если в дейтаграмме больше байтов, чем остается в заданных буферах, то оставшаяся часть дейтаграммы автоматически отбрасывается

Когда вы имеете дело с SocketChannel, это поток сообщений;нет никакой гарантии, сколько или как мало данных вы получите при каждом чтении, поскольку TCP повторно собирает отдельные пакеты, чтобы воссоздать сообщение с другой стороны.Но для UDP (который вы читаете с помощью DatagramChannel) каждый пакет представляет собой собственное атомарное сообщение.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top