3

我有一個問題試圖讓Android應用程序(以及服務,它有什麼區別)使用持久的HTTP 1.1連接。Android上的持久HttpURLConnections

以下循環(簡化測試用例)通過桌面JRE上的單個TCP會話工作,但在Android設備上會導致整個套接字創建/拆卸週期。

 while (true) { 
      URL url; 
      try { 
       url = new URL("http://10.0.0.125:8080/SRV?"); 

       URLConnection connection = url.openConnection(); 

       HttpURLConnection httpConnection = (HttpURLConnection) connection;     
       int responseCode = httpConnection.getResponseCode(); 

      } catch (MalformedURLException e) { 
      } catch (IOException e) { 
      }  
     } 

甲骨文的JDK介紹了一種叫做 '系統屬性':

http.keepAlive = 默認:真

http.maxConnections = 默認:5

Android的運行時是否有類似的東西阻止持久連接的維護?

回答

4

Android的JVM使用Apache HTTP組件庫中的HTTP連接(即使是使用java.net接口完成的連接):因此,這種行爲與Oracle JVM有細微的差別。

理論上潛在的和諧代碼尊重http.keepAlive系統屬性,但谷歌的副本是否會保留該行爲是不能肯定我。

如果你想完全確定發生了什麼,你必須使用HttpComponents代碼。這是漫長而痛苦的,但如果你看看http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html它概述了HTTP組件的連接管理方法。請參閱第2.11節,其中詳細介紹瞭如何使用HTTP組件顯式控制連接管理。

祝你好運。

+0

作爲一個快速測試,你也可以試試[URLConnection.setRequestProperty(「Connection」,「keep-alive」)](http://developer.android.com/reference/java/net/URLConnection.html#setRequestProperty% 28java.lang.String,%20java.lang。字符串%29)如果設置需要的頭部有竅門。 – harism 2011-05-06 23:15:33

+1

感謝您指點正確的方向 - 對於java.net內部使用Apache的HttpClient的事實,Google文檔並不特別直截了當。我將使用Apache接口(以及2.11中提供的信息)重寫我的代碼,並會保持更新。 – qdot 2011-05-06 23:15:57

+0

@harism - 它似乎沒有改變任何東西。 – qdot 2011-05-07 00:17:53

3

我看到持久HTTP 1.1連接沒有建立相同的問題。我寫了一個快速測試應用程序來獲取更多細節。

首先,我從我的應用程序執行了TCP轉儲流量,以查看發生了什麼。 「Connection:keep-alive」正在正確發送到我的服務器。然後,我的服務器響應「連接:保持活動」。然而,在我的應用程序關閉其連接的InputStream之後,底層套接字也被Android關閉......而不是被持久化。

爲了深入挖掘,我寫我的應用程序中使用兩種不同的方法來連接:

HttpURLConnection的CON =(HttpURLConnection類)url.openConnection();

AND

HttpClient的客戶=新DefaultHttpClient();

它變成是HttpClient的不堅持的根本插座,但HttpURLConnection類一樣。因此,如果你想獲得最佳性能,請使用HttpURLConnections,直到Android在DefaultHttpClient中解決此錯誤。

好像在Android的HTTP 1.1實現中的錯誤?

+0

針對薑餅及更高版本的應用程序使用HttpURLConnection。 https://developer.android.com/training/basics/network-ops/connecting.html – a48070 2013-11-21 16:40:22