2016-01-12 46 views
0

報價從developer site「插槽共享」在實施HttpURLConnection的

爲了減少等待時間,這類可能重複用於多個請求/響應對的相同的底層插槽。結果,HTTP連接可能會被保持打開的時間超過必要的時間。

這意味着TCP連接可能會被多個HttpURLConnection實例共享(另請參閱here)。

假設我有兩個單獨的後臺線程,它通過兩個不同的HttpURLConnection發送請求到相同的主機。如果底層套接字在兩個連接之間共享,則服務器返回的數據將被兩個線程同時讀取並導致數據損壞。

但是,當我測試我的Android應用程序時,我從來沒有遇到過這個問題。那麼這是否意味着Socket永遠不會共享,或者我錯過了什麼?

回答

1

聲明

爲了減少等待時間,這類可能重複用於多個請求/響應對的相同的底層插槽。

並不意味着套接字總是被重用,它只是表明它們可能被重用。如果兩個線程同時使用兩個URLConnection,則它們不能共享套接字,因爲單個套接字不能同時被多個線程使用。

URLConnection實現保證單個URLConnection獨立於同一運行時環境中的任何其他連接,因此並行連接不能重複使用它們的套接字。

但是,如果一個線程在其他線程打開其URLConnection之前關閉其URLConnection,則它們可以重新使用現有套接字。

+0

所以如果我有20個線程在同一時間請求,我至少有20個不同的TCP連接在運行時? http rfc表示客戶端不應該有超過2個連接到同一個主機。 – suitianshi

+0

更正,除非您強制實施自己的限制,否則Java將愉快地創建更多的TCP連接。你期望什麼?如果一個'URLConnection'阻塞,直到少於兩個其他'URLConnection'連接到同一個主機?這些建議應該在程序和/或服務器中執行,而不是在標準庫中執行。 –