Потоковый ответ на сокете в Java - PullRequest
3 голосов
/ 24 ноября 2010

У меня есть сервер сокетов Java, и сокет подключения работает просто отлично.Мне нужна помощь с потоковой передачей ответа клиенту.

Я получаю выходной поток с socket.getOutputStream().Как сделать так, чтобы при записи в выходной поток он сразу отправлялся, но в будущем по тому же соединению я мог отправить еще один кусок данных.

Я пытался просто использовать write и write в сочетании с flush, но я действительно не знаю, что я делаю ...

Ответы [ 3 ]

3 голосов
/ 24 ноября 2010

В зависимости от собственной реализации сокет может иметь буфер и не отправлять байты в секунду, когда вы вызываете write (). Однако flush () принудительно отправляет байты. Обычно рекомендуется отправлять большие куски, а не байты (для потоковой передачи вы обычно начинаете с создания буфера на стороне получателя). Оптимальным использованием сети может быть отправка как можно больших пакетов (ограничено MTU). Чтобы иметь локальный буфер в Java, оберните выходной поток сокета в BufferedOutputStream.

2 голосов
/ 24 ноября 2010

flush () принудительно отправляет данные в ОС. ОС может буферизовать данные и ОС на клиенте. Если вы хотите, чтобы ОС отправляла данные раньше, я советую отключить алгоритм Nagle. socket.setTcpNoDelay (истина); Однако вы обнаружите, что параметры ОС / драйвера могут по-прежнему вводить некоторую буферизацию / пакетное согласование.

Если вы посмотрите Sun jDK 6 java.net.SocketOutputStream, вы увидите, что метод flush () ничего не делает. Это не гарантируется для всех платформ, и может потребоваться flush ().

1 голос
/ 24 ноября 2010

Другое решение может быть DataOutputStream
DataOutputStream dataOut = new DataOutputStream(socket.getOutputStream());
dataOut.writeInt(1)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...