Используя NIO DatagramChannel, нужно ли мне будет обрабатывать частично прочитанные / записанные пакеты?
Вопрос
При использовании SocketChannel вам необходимо сохранить буферы чтения и записи для обработки частичной записи и считывания.
У меня есть ноющее подозрение, что это может не понадобиться при использовании DatagramChannel, но информации мало.
Что это за история?
Должен ли я вызывать (неблокирующий) receive (ByteBuffer) повторно, пока не получу null обратно, чтобы прочитать все ожидающие дейтаграммы?
При отправке в неблокирующем режиме могу ли я полагаться на send (ByteBuffer, SocketAddress) для отправки всего буфера или отклонения его полностью, или мне нужно, возможно, сохранить частично записанные буферы?
Решение
Каждое считывание дейтаграммы - это вся дейтаграмма целиком, ни больше, ни меньше.В описании java.nio.DatagramChannel.read есть намек на то, что это так:
Если в дейтаграмме больше байтов, чем остается в заданных буферах, то оставшаяся часть дейтаграммы автоматически отбрасывается
Когда вы имеете дело с SocketChannel, это поток сообщений;нет никакой гарантии, сколько или как мало данных вы получите при каждом чтении, поскольку TCP повторно собирает отдельные пакеты, чтобы воссоздать сообщение с другой стороны.Но для UDP (который вы читаете с помощью DatagramChannel) каждый пакет представляет собой собственное атомарное сообщение.