Информация о том, сколько данных было получено одноранговым узлом, по существу не подлежит восстановлению (когда обсуждение ограничено самим протоколом TCP). IOW: Вы не можете сделать то, что пытаетесь сделать, просто изменив клиент.
Да, TCP действительно включает двунаправленные ACK, которые включают информацию о том, сколько данных было успешно передано , но эта информация напрямую недоступна для прикладного уровня.
Даже если бы вы могли получить доступ к информации TCP ACK, нет никакого способа узнать, что вы получили каждое подтверждение ACK от партнера отправлено , в данный момент соединение не установлено. (См .: Проблема двух генералов .)
Обратите внимание, что даже если вы не используете BufferedOutputStream
, буферизация по-прежнему происходит на уровне TLS и на нескольких сетевых уровнях, в том числе в пределах ядро.
Итог: невозможно узнать состояние «получателя» однорангового узла со 100% -ной уверенностью, если только эта информация не передана явно, или оба партнера не имеют некоторого способа согласовать общее «основное» состояние которая существует в момент начала соединения.
В большинстве практических систем клиентский запрос о состоянии однорангового узла будет иметь место в начале разговора (HTTP HEAD
, например), или они будут отслеживать явные подтверждения, отправленные партнером. Обратите внимание, что даже упорядоченное закрытие соединения может служить явным подтверждением.