Как очистить SocketChannel в Java NIO? - PullRequest
5 голосов
/ 16 сентября 2011

В Java IO OutputStream может использовать метод flush(), чтобы убедиться, что данные отправляются сразу.

Есть ли в Java NIO соответствующая функция для SocketChannel?Насколько я знаю, существует force() метод для FileChannel сброса данных.

Возможно, это очень наивный вопрос ...

Ответы [ 3 ]

8 голосов
/ 16 сентября 2011

OutputStream.flush() ничего не делает, кроме очистки буферов любых BufferedOutputStream с, ObjectOutputStream с или PrintStream с, находящихся в стеке.

В частности, он не делает ничего, соответствующего FileChannel.force() или getFD().sync(). Он просто сбрасывает потоковые буферы из JVM в (в данном случае) буфер отправки сокета в ядре.

SocketChannel.write() вообще не включает в себя такую ​​буферизацию: он идет прямо в буфер отправки сокета в ядре. Так что промывать нечего, операция промывки отсутствует.

4 голосов
/ 16 сентября 2011

Когда вы форсируете () данные на диск, ОС может определить, что они были успешно записаны на диск.Однако связь по протоколу TCP является более сложной, и данные проходят через многие этапы вне контроля ОС.Вообще говоря, операционная система заканчивает работу с данными как можно скорее и не буферизует данные сокета (обычно около 64 КБ) в той степени, в которой она буферизует записи на диск (иногда ГБ)

Лучший способубедитесь, что данные были получены успешно, чтобы другой конец отправлял ответ.

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

1 голос
/ 16 сентября 2011

Используйте либо .force(), либо .getFD.sync()

Обновление: поскольку вы обновили свой вопрос, чтобы он был более конкретным в SocketChannel (обычно это был NIO), см. Мой ответ.

...