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