Я прочитал, что 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-соединению (проверено с помощью wireshark), но я не могу понять, почему (хотя это то, что я хочу), так как я назвал отключение.
Я проверил исходный код для HttpURLConnection, и реализация поддерживает постоянный кеш подключений к тем же адресатам. Моя проблема в том, что я не могу видеть, как соединение помещается обратно в кеш после отправки первого запроса. Разъединение закрывает соединение и без разъединения все равно не вижу, как соединение снова помещается в кеш. Я видел, что в кеше есть метод run для прохождения всех незанятых соединений (я не уверен, как он вызывается), но я не могу найти, как соединение помещается обратно в кеш. Единственное место, которое, по-видимому, происходит, это готовый метод httpClient, но он не вызывается для POST с ответом.
Может ли кто-нибудь помочь мне в этом?
EDIT
Меня интересует, как правильно обрабатывать объект HttpUrlConnection для повторного использования tcp-соединения. Если поток ввода / вывода закрыт, за ним следует url.openConnection (); каждый раз отправлять новый запрос (избегая disconnect ())? Если да, я не могу видеть, как повторно используется соединение, когда я вызываю url.openConnection () во второй раз, так как соединение было удалено из кэша для первого запроса и не могу найти, как оно возвращается обратно.
Возможно ли, что соединение не возвращается обратно в кеш-память активности (ошибка?), Но ОС еще не освободила соединение tcp, а при новом соединении ОС возвращает буферизованное соединение (еще не освобожденное) или что-то подобное?
EDIT2
Единственное, что я нашел, было от JDK_KeepAlive
... когда приложение вызывает close ()
на InputStream, возвращаемом
URLConnection.getInputStream (),
Обработчик протокола HTTP JDK попытается
очистить соединение и, если
успешно, поместите соединение в
кэш подключений для повторного использования в будущем
HTTP-запросы.
Но я не уверен, какой это обработчик. sun.net.www.protocol.http.Handler не выполняет никакого кэширования, как я видел
Спасибо!