Почему скорость загрузки отличается между HttpURLConnection и HttpsURLConnection?

Я использую HttpURLConnection или HttpsURLConnection для загрузки контента. Мой вопрос: почему скорость загрузки отличается между HttpURLConnection и HttpsURLConnection?

Вот фрагмент:

if (downloadurl.startsWith("https://")) {
   HttpsConn = (HttpsURLConnection) url.openConnection();
   HttpsURLConnection.setDefaultHostnameVerifier(new AllowAllHostNameVerifier());       

    SSLContext sc;
                sc = SSLContext.getInstance("TLS");
                sc.init(null, new TrustManager[] {
                          new X509TrustManager() {
                                public void checkClientTrusted(X509Certificate[] chain, String authType) {}
                                public void checkServerTrusted(X509Certificate[] chain, String authType) {}
                                public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[]{}; }
                              }
                            }, null);
                HttpsConn.setSSLSocketFactory(sc.getSocketFactory());
   HttpsConn.setSSLSocketFactory(sc.getSocketFactory());

   HttpsConn.setConnectTimeout(CONNECT_TIME_SECONDS * 1000);
   HttpsConn.setReadTimeout(READ_TIME_SECONDS * 1000);
   HttpsConn.setChunkedStreamingMode(0);  
   HttpsConn.connect();
} else {
   URLConn = (HttpURLConnection) url.openConnection();
   URLConn.setConnectTimeout(CONNECT_TIME_SECONDS * 1000);
   URLConn.setReadTimeout(READ_TIME_SECONDS * 1000);
   URLConn.setChunkedStreamingMode(0);  
   URLConn.connect();
}               

                                   .
                                   .
                                   .

byte data[] = new byte[1048576];
double currentDownloadSize = 0.0;
long startTime = System.currentTimeMillis();
lastUpdateTime = startTime;
int count;

while ((count = input.read(data)) != -1) {
    currentDownloadSize += count;
    output.write(data, 0, count);
        Thread.sleep(10);

    if (isCancelled()) {
        output.flush();
        output.close();
        input.close();
    }
}

output.flush();
output.close();
input.close();

Скорость загрузки в порядке, когда я использую HttpURLConnection для загрузки файла, но когда я использую HttpsURLConnection, скорость загрузки очень и очень низкая. Я думал, что ключевым моментом является inputStream! Поскольку размер буфера InputStream зависит от размера байта, который я назначил при использовании HttpURLConnection, скорость загрузки выше, так как тратится меньше времени на запись данных буфера в файл. Но я всегда получал только 8000 байт каждый цикл, когда я использую HttpsURLConnection, скорость загрузки немного ужасна.

У кого-нибудь есть идеи?


person 梁峻騰    schedule 18.11.2014    source источник


Ответы (1)


Избавьтесь от sleep() для начала. Это просто пустая трата времени. Все, что он делает, — это увеличивает эффект меньших чтений, который вы, безусловно, получите с HTTPS, поскольку ограничение размера блока TLS составляет около 16 КБ. flush() перед close() также является избыточным, и вы неправильно выходите из цикла при отмене. Измените свой цикл на это:

while ((count = input.read(data)) != -1) {
    currentDownloadSize += count;
    output.write(data, 0, count);

    if (isCancelled()) {
        break;
    }
}
output.close();
input.close();

... и по возможности больше ничего не делайте в цикле.

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

Я не знаю, что вы подразумеваете под «размером буфера InputStream ... зависит от размера байтов, который я назначил при использовании HttpURLConnection». Это не так. В InputStream нет буфера, если только это не BufferedInputStream, и вы вообще не «назначали» какой-либо «размер в байтах», если только вы не имеете в виду буфер byte [], который никоим образом не принадлежит InputStream.

Ваш заголовок не согласуется с основной частью вашего вопроса.

person user207421    schedule 18.11.2014
comment
Спасибо, что поделились. Есть ли у вас какие-либо предложения о том, как прочитать около 16k за один раз? - person 梁峻騰; 18.11.2014
comment
Вы задаете неправильный вопрос. Вы не можете контролировать, сколько данных доступно для чтения или скорость SSL. Что вам нужно сделать, так это прочитать все, что приходит, как можно быстрее. Добавление сна и другого кода в цикл чтения этого не сделает. - person user207421; 18.11.2014