Блокирует ли класс Java Socket TCP при отправке данных - PullRequest
2 голосов
/ 28 февраля 2011

Когда я использую класс Socket Javaa для отправки байтового массива, выполняет ли вызов записи в следующем блоке кода, пока он не подтвердит, что получатель получил данные?

byte data[] = ...;
Socket socket = ...;

socket.getOutputStream().write(data); // blocking ?

Причина, по которой я спрашиваю, если у меня есть список сокетов, в которые я хочу отправить те же данные, я хочу отправить их максимально эффективно, т. е. есть ли лучший способ, чем этот:

ArrayList<Socket> sockets = ...;
byte data[] = ...;

for(int i = 0; i < sockets.size(); i++)
  sockets.getOutputStream().write(data);

1 Ответ

5 голосов
/ 28 февраля 2011

TCP-квитирование происходит во время connect(2), а не во write(2).

Вызовы write(2) будут блокироваться до тех пор, пока буфер отправки ОС TCP не будет исчерпан настолько, чтобы принимать больше данных из программы.(Я не могу себе представить, чтобы ОС разблокировала операцию write(2) для одного свободного байта.)

Единственная гарантия, что у вас есть это то, что клиент принимал данные в прошлом и не отстает отразмер окна TCP для сеанса плюс размер внутренних буферов ОС.Достигнут ли какие-либо из этих данных приложение в другой конечной точке - это еще один уровень буферов - стек TCP на удаленном одноранговом узле будет подтверждать полученные данные и сохранять их в буферах до того, как приложениевозможность обработать его.

...