Постоянное HttpURLConnection в Java

Я пытаюсь написать java-программу, которая будет автоматически загружать и называть некоторые из моих любимых веб-комиксов. Поскольку я буду запрашивать несколько объектов из того же домена, я хотел бы иметь постоянное http-соединение, которое я мог бы открыть, пока не будут загружены все комиксы. Ниже приведена моя работа. Как сделать другой запрос из того же домена, но с другим путем, не открывая новое http-соединение?

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class ComicDownloader
{
    public static void main(String[] args)
    {
        URL url = null;
        HttpURLConnection httpc = null;
        BufferedReader input = null;

        try
        {
            url = new URL("http://www.cad-comic.com/cad/archive/2002");
            httpc = (HttpURLConnection) url.openConnection();
            input = new BufferedReader(new InputStreamReader(httpc.getInputStream()));
            String inputLine;

            while ((inputLine = input.readLine()) != null)
            {
                System.out.println(inputLine);
            }

            input.close();
            httpc.disconnect();
        }
        catch (IOException ex)
        {
            System.out.println(ex);
        }
    }
}

Ответ 1

В соответствии с документацией , настойчивость HTTP обрабатывается прозрачно на Java, хотя она дает вам возможность контролировать ее также через http.keepAlive и http.maxConnections.

Однако

Текущая реализация не буфера тела ответа. Что значит что приложение должно закончить чтение тела ответа или вызов close(), чтобы оставить остальную часть ответного органа, для этого соединение для повторного использования. Более того, текущая реализация не будет пытаться блочное считывание при очистке соединение, то есть, если целое орган ответа недоступен, соединение не будет использоваться повторно.

Взгляните на ссылку и посмотрите, действительно ли это поможет вам.

Ответ 2

По умолчанию HttpURLConnection достаточно умен, чтобы повторно использовать соединение с одним и тем же хостом, если хост-сервер включен.

Однако обработка ошибок слаба, и вы можете столкнуться с ситуацией, когда клиент и хост не синхронизированы, и соединение просто зависает. Поэтому мы всегда отключаем keep-alive.

Ответ 3

В соответствии с этой ссылкой http://docs.oracle.com/javase/6/docs/technotes/guides/net/http-keepalive.html, повторное использование HTTP-соединения включено по умолчанию, вы можете использовать Wireshark для проверки взаимодействия между вашим клиентом и сервер. Первый запрос содержит рукопожатия TCP и SSL (если ваш запрос https), последующие запросы, запущенные в режиме keep-alive, не содержат протоколов TCP и SSL, а также передачи данных приложения.