Я читал, что HttpURLConnection поддерживает постоянные соединения, так что соединение может быть повторно использовано для нескольких запросов. Я попробовал это, и единственный способ отправить второй POST - это вызов openConnection во второй раз. В противном случае я получил исключение IllegalStateException ( "Уже подключено" ); Я использовал следующее:
try{
URL url = new URL("http://someconection.com");
}
catch(Exception e){}
HttpURLConnection con = (HttpURLConnection) url.openConnection();
//set output, input etc
//send POST
//Receive response
//Read whole response
//close input stream
con.disconnect();//have also tested commenting this out
con = (HttpURLConnection) url.openConnection();
//Send new POST
Второй запрос отправляется по тому же TCP-соединению (проверено с помощью wirehark), но я не могу понять, почему (хотя это то, что я хочу), так как я вызвал disconnect. Я проверил исходный код для HttpURLConnection, и реализация сохраняет кэш-память keepalive подключений к тем же адресам. Моя проблема в том, что я не вижу, как соединение помещается обратно в кеш после того, как я пришлю первый запрос. Отключение закрывает соединение и без разъединения, но я не вижу, как соединение помещается обратно в кеш. Я видел, что в кеше есть метод запуска для прохождения через все незанятые соединения (я не уверен, как это называется), но я не могу найти, как соединение помещается обратно в кеш. Единственное место, которое, похоже, происходит в готовом методе httpClient, но это не вызвано POST с ответом. Может ли кто-нибудь помочь мне в этом?
ИЗМЕНИТЬ Я заинтересован в том, что правильная обработка объекта HttpUrlConnection для повторного использования соединения tcp. Если поток ввода/вывода должен быть закрыт, а затем url.openConnection(); каждый раз, чтобы отправить новый запрос (избегая отключения())? Если да, я не вижу, как соединение повторно используется, когда я вызываю url.openConnection() во второй раз, поскольку соединение было удалено из кеша для первого запроса и не может найти способ его возврата. Возможно ли, что соединение не возвращается обратно в кэш keepalive (ошибка?), Но ОС еще не освободила соединение tcp и при новом подключении, ОС возвращает буферное соединение (еще не выпущенное) или что-то подобное? EDIT2 Единственное, что я нашел, - это JDK_KeepAlive
... когда приложение вызывает close() на InputStream, возвращаемом URLConnection.getInputStream(), Обработчик протокола JDK HTTP попытается для очистки соединения, и если успешно, установите соединение в кэш подключений для повторного использования в будущем HTTP-запросы.
Но я не уверен, какой это обработчик. sun.net.www.protocol.http.Handler не делает никакого кэширования, поскольку я видел Спасибо!