При использовании NIO DatagramChannel мне нужно будет обрабатывать частично прочитанные / записанные пакеты? - PullRequest
3 голосов
/ 02 апреля 2009

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

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

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

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

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

1 Ответ

5 голосов
/ 02 апреля 2009

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

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

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

...