2016-02-04 83 views
1

在閱讀了關於Java HttpURLConnection的各種文檔之後,我仍然很困惑它是什麼類型的池以及它如何連接。Java HttpURLConnection和池

例如,下面的代碼

URL url = new URL(someUrl); 
HttpURLConnection connection = (HttpURLConnection)url.openConnection(); 
OutputStream os = connection.getOutputStream(); 
InputStream is = connection.getInputStream(); 

/** Write something to os and flush */ 
/** Read from is */ 

os.close(); 
is.close(); 
connection.disconnect(); 
  1. 做既osis需要被刷新,關閉底層套接字是可重複使用的?

  2. connection.disconnect()關閉底層套接字(並因此使其不可用)? keep-alive會影響這種行爲嗎?

  3. 如果我使用不同的URL對象,但使用相同的URL,那麼從它們創建的connection是否共享底層套接字?怎麼樣當URL的主機部分是相同的,但路徑不同?

  4. 什麼時候會將連接的連接銷燬?

  5. 什麼是控制池大小的系統屬性?

此外,如果您還可以比較Android版本和Java,那就太棒了。

感謝

回答

5
  1. 一舉兩得osis需要被刷新,關閉底層套接字是可重複使用的?

關閉輸入流就足夠了。您無法刷新輸入流,並且在關閉之前刷新輸出流是多餘的。

  • connection.disconnect()關閉基礎插座(並且因此使其不可再)?
  • 它'作爲提示'來關閉底層連接。

    keep-alive是否會影響此行爲?

    是的。如果不存在,則必須關閉連接。

  • 如果使用不同的URL對象,但具有相同的URL,將他們創建的connection一同分享底層插座?
  • 是的。

    當URL的主機部分相同但路徑不同時如何?

    是的。

    1. 什麼時候合併連接被銷燬?

    空閒超時後。

    1. 什麼是控制池大小的系統屬性?

    我不知道,有一個,但如果它會在網絡屬性頁面,您可以通過找到的Javadoc定義。

    此外,如果您還可以比較Android版本和Java,那就太好了。

    我相信Android根本就沒有進行池化,但是當它們切換到OpenJDK源代碼時,它應該會改變。

    +1

    關於第一點,我做了兩個測試,每個測試有10個請求。在第一次測試中,我使用getContent獲得了InputStream並關閉了它。在第二次測試中,我也在關閉之前閱讀整個流。結果對於每一輪中的第二個請求都是不同的:當我關閉InputStream時,其他8個請求(第一個是800ms,第二個是600,其餘的是140ms)相當慢,當時我也只讀了響應第一次花了800,其餘花了140ms。不知道爲什麼會這樣。使用JDK 1.8.0_51。 –

    +1

    看起來觀察到的行爲與JDK 1.6中引入的http.KeepAlive.remainingData有關。 http://docs.oracle.com/javase/6/docs/technotes/guides/net/http-keepalive.html –

    +0

    你碰巧有你的觀點文件嗎? –