Надежная запись в Java SocketChannel - PullRequest
2 голосов
/ 13 сентября 2010

У меня есть вопрос относительно java SocketChannel.

Допустим, у меня открыт канал сокета в режиме блокировки; после вызова метода write (ByteBuffer) я получаю целое число, описывающее, сколько байтов было записано. Javadoc говорит: «Возвращает: количество записанных байтов, возможно, ноль»

Но что именно точно это значит? Означает ли это, что число байтов действительно было доставлено клиенту (чтобы отправитель получил tcp ack, делая очевидным, сколько байтов было получено сервером), или это означает, что число байтов был записан в стек tcp? (так что некоторые байты все еще могут ожидать, например, в буфере сетевой карты).

Ответы [ 2 ]

5 голосов
/ 13 сентября 2010

означает ли это, что количество байтов действительно было доставлено клиенту

Нет. Это просто означает количество байтов, доставленных в локальный сетевой стек.

Единственный способ убедиться, что данные были доставлены в удаленное приложение, - это получить подтверждение уровня приложения для данных.

0 голосов
/ 13 сентября 2010

Параграф, который вас смущает, предназначен для неблокирующих операций ввода / вывода.

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

Если не указано иное, операция записи будет возвращена только после записи всех r запрошенных байтов.Некоторые типы каналов, в зависимости от их состояния, могут записывать только некоторые байты или, возможно, вообще ни одного.Например, канал сокета в неблокирующем режиме не может записать больше байтов, чем свободно в выходном буфере сокета.

Как видите, для блокирования ввода-вывода будут отправляться все байты(или исключение выдается в середине отправки)

Обратите внимание, что нет гарантии того, когда байты появятся на принимающей стороне, это полностью соответствует протоколу сокетов низкого уровня.

...