为什么HttpURLConnection和HttpsURLConnection之间的下载速度不同?

时间:2014-11-18 03:15:38

标签: android inputstream outputstream httpsurlconnection

我正在使用HttpURLConnectionHttpsURLConnection下载内容。我的问题是为什么HttpURLConnectionHttpsURLConnection?

之间的下载速度不同

这是一个片段:

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时分配的字节大小,因此下载速度更快,因为它将缓冲区数据写入文件所花费的时间更少。但是当我使用HttpsURLConnection时,每个循环总是只有8000字节,下载速度有点可怕。

有人有想法吗?

1 个答案:

答案 0 :(得分:0)

首先摆脱sleep()。这只是浪费时间。它所做的就是放大较小读取的效果,你肯定会使用HTTPS,因为TLS块大小限制大约为16k。 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

你的头衔与你的问题主体不一致。