Android: OutputStreamWriter не отправил данные после сброса (сокет) - PullRequest
2 голосов
/ 04 сентября 2011
OutputStreamWriter out = new OutputStreamWriter(sock.getOutputStream());

out.write(data);
out.flush();

носок - розетка;data - буфер символов;

Итак, если я не закрою «out» или «sock», то на сервер не будет отправлено никаких данных.

OutputStreamWriter out = new OutputStreamWriter(sock.getOutputStream());

out.write(data);
out.close();

Isхорошо.Но почему?

1 Ответ

0 голосов
/ 06 ноября 2011

flush() только сбрасывает буфер уровня приложений Java / Android в стек TCP. Оказавшись там, он может быть дополнительно задержан реализацией TCP ОС, которая пытается эффективно использовать передаваемые пакеты и ожидает большего количества данных. (Поищите «алгоритм Нейгла», если вам нужно больше подробностей.)

Невозможно очистить буфер TCP при записи в сокет, но сокет может быть настроен на немедленную отправку всех данных в буфере, когда это возможно, путем установки TCP_NODELAY

См. Java ObjectOutputStream на Socket not flush () ing для получения дополнительной информации по теме.

...