2011-05-29 51 views
2

我正在使用HttpURLConnection在Java中下載頁面。我忘了釋放連接,我認爲這給我的系統(網絡爬蟲)帶來了一些問題。在Java中,如何使用HttpURLConnection連接並釋放端口/套接字?

現在我已經做了一些測試,看到斷開連接後,在Windows上的netstat命令的結果中,某些連接仍然像TIME_WAIT一樣。

我該如何立即釋放此連接?

示例代碼:

private HttpURLConnection connection; 

boolean openConnection(String url) { 
    try { 
     URL urlDownload = new URL(url); 
     connection = (HttpURLConnection) urlDownload.openConnection(); 
     connection.setInstanceFollowRedirects(true); 
     connection.connect(); 
     connection.disconnect(); 
     return true; 
    } catch (Exception e) { 
     System.out.println(e); 
     return false; 
    } 
} 

回答

3

在一些實現中,如果你調用getInputStreamgetOutputStream,你需要確保這些流被關閉。否則,即使撥打disconnect後,連接仍可以保持打開狀態。

編輯:

這是從J2SE docs爲HttpURLConnection的[強調]:

調用disconnect()方法可以關閉基礎插座如果持久連接是在該另外空閒時間。

這是從Android docs

爲了減少等待時間,這類可能重複用於多個請求/響應對的相同的底層插槽。因此,HTTP連接可能會保持打開時間超過必要的時間。調用disconnect()將套接字返回到連接的套接字池。在發出任何HTTP請求之前,可以通過將「http.keepAlive」系統屬性設置爲「false」來禁用此行爲。 「http.maxConnections」屬性可用於控制每個服務器將保留多少空閒連接。

我不知道你在使用什麼平臺,但它可能有類似的行爲。

+0

什麼是差異readiing直接到一個InputStream或類似的文檔,到BufferedInputStream? – 2011-05-29 03:38:02

+0

'BufferedInputStream'在內存中緩衝塊。注意與您遇到的問題相關的問題,只要您以通常的方式關閉它即可。做'System.setProperty(「http.keepAlive」,「false」)'應該這樣做。 – BalusC 2011-05-29 03:50:59

+0

BufferedInputStream將套接字從套接字讀取到緩衝區中,然後以您請求的任何大小的塊傳送內容給您。從一個InputStream讀取少量的套接字連接數據效率極低。但是,如果您只是自己進行批量讀取,則不需要BufferedInputStream。 – 2011-05-29 04:43:32

0

TME_WAIT狀態是由TCP而不是由Java強加的。它持續兩分鐘。這個是正常的。