2010-07-21 64 views
14

我想寫一個Java程序,將自動下載並命名我最喜歡的一些網絡漫畫。由於我將要求來自同一個域的多個對象,因此我希望有一個持續的http連接,我可以保持打開狀態,直到所有的漫畫被下載。以下是我的工作進展。如何在不打開新的http連接的情況下從同一個域但不同路徑發出另一個請求?在Java中的持久HttpURLConnection

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); 
     } 
    } 
} 

回答

16

按照,HTTP持久性被透明地在Java中處理,但它給你的選項通過http.keepAlivehttp.maxConnections系統屬性來控制它。

然而,

當前的實現不 緩衝響應主體。這意味着 應用程序必須完成 讀取響應正文或調用 close()放棄響應正文的其餘部分,以便 連接被重用。此外, 當前實現不會嘗試 塊清理時連接的 連接,這意味着如果整個 響應正文不可用, 連接將不會被重新使用。

看看鏈接,看看它是否真的幫助你。

+0

鏈接已死?它也適用於更新版本的Java嗎? – rogerdpack 2013-10-09 16:41:03

+1

@royerdpack當然是的。你不能認真地相信他們會採取這樣的有價值的功能。 – EJP 2014-01-10 18:11:59

+0

@rogerdpack下次使用Google搜索:https://www.google.com/search?q=java+api+doc+net%2Fhttp-keepalive.html同時我正在修復該鏈接。 – yclian 2014-01-11 11:06:36

6

默認情況下,如果主機啓用了保持活動狀態,則HttpURLConnection足夠聰明,可重新使用與同一主機的連接。

但是,錯誤處理很弱,您可能會遇到客戶端和主機不同步並且連接掛起的情況。因此,我們總是禁用保持活動。

+0

你有任何鏈接在HttpURLConnection重用連接的文件?我真正的問題是...如果我每次新建一個URL對象,比如'new URL(urlString).openConnection();'它是否使用連接池(如果可用)... – rogerdpack 2013-10-09 16:42:27

+1

@rogerdpack這裏有一些文檔:http: //docs.oracle.com/javase/6/docs/technotes/guides/net/http-keepalive.html爲了回答你的問題,它確實顯示它(「它」是平臺實現)使用連接池,所以爲每個請求創建一個URL對象仍然會重用連接。 – Jeff 2013-10-25 18:39:50

+0

Sum有任何videmceevid,而且錯誤處理很弱,客戶端和服務器不同步?沒有資料的軼事是不夠的。 – EJP 2017-02-13 11:36:51