Android HttpURLConnection.getInputStream非常慢

Android HttpURLConnection.getInputStream非常慢,android,inputstream,httpurlconnection,androidhttpclient,Android,Inputstream,Httpurlconnection,Androidhttpclient,与使用相同服务器端服务的iPhone应用程序相比,HttpURLConnection.getInputStream需要花费很多时间 以下代码用于该服务: date= new java.util.Date(); Log.d("time","Time Stamp before posting "+new Timestamp(date.getTime())); URL ur= new URL(url);

与使用相同服务器端服务的iPhone应用程序相比,HttpURLConnection.getInputStream需要花费很多时间

以下代码用于该服务:

         date= new java.util.Date();             
         Log.d("time","Time Stamp before posting  "+new Timestamp(date.getTime()));

         URL ur= new URL(url);           
         HttpURLConnection conn = (HttpURLConnection) ur.openConnection();
         conn.setRequestProperty("Connection", "close");
         conn.setReadTimeout(10000);
         conn.setConnectTimeout(15000);
         conn.setRequestMethod("POST");
         conn.setDoInput(true);
         conn.setDoOutput(true);             
         OutputStream os = conn.getOutputStream();
         BufferedWriter writer = new BufferedWriter(
                 new OutputStreamWriter(os, "UTF-8"));
         writer.write(getQuery(nameValuePairs));
         writer.close();
         os.close();
         conn.connect();

         StringBuffer response=null;             
         try{           
             Log.d("time","Time Stamp bfr InputStream  "+new Timestamp(date.getTime()));    

             InputStream is = conn.getInputStream();

             date= new java.util.Date();             
             Log.d("time","Time Stamp aftr InputStream  "+new Timestamp(date.getTime()));            

             BufferedReader rd = new BufferedReader(new InputStreamReader(is));
             String line;
             response = new StringBuffer(); 
             while((line = rd.readLine()) != null) {
                 response.append(line);
                 response.append('\r');
             }
             rd.close();
             response.toString();
             result=response.toString();

         } catch (Exception e) {

        }
为了检查服务在哪里花费时间,我将日志条目放在打印时间戳上

该过程的平均时间如下所示:

发送到服务器的平均时间少于2 Mil秒
创建输入流的平均时间约为5秒

写入响应的平均时间小于2密耳秒


你知道为什么输入流需要很长的时间,这使得整个服务非常慢吗?

将urlConnection.setConnectTimeout()设置为较低的超时

URLConnection.setConnectTimeout()的类文档说明:

设置连接时等待的最长时间(毫秒)。如果在建立连接之前超时,则连接到服务器将失败,并出现SocketTimeoutException。默认值0导致我们进行阻塞连接。这并不意味着我们将永远不会超时,但它可能意味着您将在几分钟后获得TCP超时

警告:如果主机名解析为多个IP地址,则此 客户将以RFC 3484的顺序尝试每一种。如果连接到其中的每一个 地址失败,连接前将经过多次超时 尝试抛出异常。同时支持IPv6和IPv6的主机名 IPv4始终至少有2个IP地址

我最初将自己的设置为
urlConnection.setConnectTimeout(30000)
然后将其更改为
urlConnection.setConnectTimeout(1000)
。立刻,我看到了更快的结果


希望这有帮助

这可能与JDK 7中引入的错误有关。“使用保持活动缓存时,HttpServer会导致1000毫秒的延迟”。见:

根据您的目的,建议的解决方法是多线程连接HttpUrlConnection。例如,如果您使用的是HttpServer,则可以执行以下操作:

server.setExecutor( Executors.newFixedThreadPool( 5 ) );

你不是在测量你认为你在测量的东西。在调用getInputStream()或getResponseCode()之前,不会向服务器写入任何内容。所以你真的在测量:

  • 连接时间
  • 传输时间
  • 服务器上的处理时间
当您认为您只是在测量getInputStream()时间时


原因是HttpURLConnection通过缓冲所有输出自动设置内容长度头。您可以通过使用分块传输模式来避免这种情况。然后,至少你会看到时间的真正走向。

你的意思是,当你遇到连接故障时,你会看到更快的连接故障。很难看出这是如何解决OP的问题的。这很奇怪,但它是有效的!也许while循环永远在循环或者其他什么,但是对我来说这个答案非常有效!仅当他在另一端使用
HttpServer
时。没有证据证明这一点。建议的解决方法是对服务器进行多线程处理,这同样是不相关的。我们将如何做到这一点?