Android上持久的HttpURLConnections

时间:2011-05-06 22:50:53

标签: java android network-programming httpurlconnection persistent

我尝试使用持久的HTTP 1.1连接尝试获取Android应用程序(好吧,服务,它有所不同)。

以下循环(简化测试用例)通过桌面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) {
            }       
        }

Oracle的JDK描述了一种叫做“系统属性”的东西:

  

http.keepAlive =   默认值:true

     

http.maxConnections =   默认值:5

Android的运行时是否存在类似的东西阻止持久连接的维护?

2 个答案:

答案 0 :(得分:4)

Android的JVM使用Apache HTTP Components库进行HTTP连接(甚至是那些使用java.net接口完成的):因此这种行为与Oracle JVM略有不同。

理论上,潜在的和谐代码尊重http.keepAlive系统属性,但谷歌的副本是否保留了这种行为对我来说并不确定。

如果你想绝对确定发生了什么,你必须使用HttpComponents代码。这是漫长而痛苦的,但如果你看一下http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html,它概述了http组件的连接管理方法。请参阅第2.11节,其中详细说明了如何使用HTTP组件显式控制连接管理。

祝你好运。

答案 1 :(得分:3)

我发现持久的HTTP 1.1连接没有建立同样的问题。我写了一个快速测试应用程序来获取更多细节。

首先,我从我的应用程序执行了TCP转储,以查看发生了什么。正在将“Connection:keep-alive”正确发送到我的服务器。然后我的服务器响应“Connection:keep-alive”。然而,在我的应用程序关闭其连接的InputStream之后,底层套接字也被Android关闭了......而不是被持久化。

为了深入挖掘,我使用两种不同的方法编写了我的应用程序连接:

HttpURLConnection con =(HttpURLConnection)url.openConnection();

HttpClient client = new DefaultHttpClient();

事实证明,HttpClient并没有持久化底层套接字,但HttpURLConnection确实如此。因此,如果您想获得最佳性能,请使用HttpURLConnections直到Android解决DefaultHttpClient中的此错误。

看起来像Android HTTP 1.1实施中的错误?