Я читал, что HttpURLConnection поддерживает постоянные подключения, так что соединение может быть повторно использовано для нескольких запросов. Я попробовал это, и единственный способ отправить второй POST - это вызов openConnection во второй раз. В противном случае я получил исключение IllegalStateException («Уже подключено»); я использовал следующее:Внедрение HttpURLConnection
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, и реализация сохраняет хранимый кэш подключений к тем же адресам. Моя проблема в том, что я не вижу, как соединение помещается обратно в кеш после того, как я пришлю первый запрос. Отключение закрывает соединение и без разъединения, но я не вижу, как соединение помещается обратно в кеш. Я видел, что в кеше есть метод запуска для прохождения через все незанятые соединения (я не уверен, как это называется), но я не могу найти, как соединение помещается обратно в кеш. Единственное место, которое, похоже, происходит в готовом методе httpClient, но это не вызвано POST с ответом. Может ли кто-нибудь помочь мне в этом?
EDIT Мой интерес, что надлежащее обращение объекта HttpURLConnection для повторного использования соединения TCP. Если поток ввода/вывода должен быть закрыт, а затем url.openConnection(); каждый раз, чтобы отправить новый запрос (избегая отключения())? Если да, я не вижу, как соединение повторно используется, когда я вызываю url.openConnection() во второй раз, поскольку соединение было удалено из кеша для первого запроса и не может найти способ его возврата. Возможно ли, что соединение не возвращается обратно в кэш-память keepalive (ошибка?), Но ОС еще не выпустила соединение tcp и при новом соединении, ОС возвращает буферное соединение (еще не выпущенное) или что-то подобное? EDIT2 только родственный я нашел был из JDK_KeepAlive
... когда приложение вызывает близко() на InputStream, возвращаемый URLConnection.getInputStream(), обработчик протокола HTTP JDK будет пытаться , чтобы очистить соединение, и если успешно, установите соединение в кеш-соединение для повторного использования в будущем HTTP-запросы.
Но я не уверен, какой обработчик это. sun.net.www.protocol.http.Handler не делает никакого кэширования, как я видел Спасибо!
В одном случае: http://stackoverflow.com/questions/2457538/several-requests-from-one-httpurlconnection?rq=1 в моем случае я получаю слишком много запроса в мой php-файл без какого-либо параметра get/post, где только 1 запрос с параметром get ... Я не знаю, почему, если HttpURLConnection предназначен для отправки одного запроса одновременно, отправка слишком большого количества запросов на сервер ...? – Bhuro