тем, что клиент после получения данных не закрывает TCP сессию.
После того как HTTP запрос уходит на удалённый сервер, сервер отвечает. Но клиент не отправляет пакеты с флагом FIN как я ожидал, если сервер после передачи запрошенных данных присылает кипэлайвед, клиент отвечает на них. И из того, что я вижу в дампах трафика сессию закрывает всегда сервер. Единственный способ заставить HttpClient завершить сессию который я нашёл выглядит как зануление ссылки на клиент и вызов сборщика мусора, но это же не выход.
код простейший, можно посмотреть тут: https://github.com/maxpushpashev/httpClient
При использовании например HttpClient от Apache можно вызвать метод закрытия сессии. А тут не вижу такого.
Может я что-то делаю не так?
-Dhttp.keepAlive=false
Завтра гляну. Спасибо
Ситуация то что клиент не закрывает соединение сам пока ему не скажет об этом сервер следует из того что HttpClient поддерживает HTTP 1.1 в котором вот такое поведение стандартное. HTTP/1.1 defines the "close" connection option for the sender to signal that the connection will be closed after completion of the response. For example, Connection: close in either the request or the response header fields indicates that the connection SHOULD NOT be considered `persistent' (section 8.1) after the current request/response is complete. Следуя букве закона можно послать сообщение "Connection: close" в header и тогда сервер должен соединение закрыть и не открывать новое. (Как всегда некоторые серверы это могут игнорировать). Закроется ли правильно соединение в пуле java.net.http.HttpClient нужно проверять, тут я к сожалению опыта не имею, проверять самому не приходилось.
Спасибо. И правда помогло. Только хидер restricted и его надо разрешить через систем проперти, которое в openJDK 11.0.12 не работает, но работает в coretto11.0.14
Обсуждают сегодня