2013-07-03 526 views
3

与使用相同服务器端服务的iPhone应用程序相比,HttpURLConnection.getInputStream需要非常多的时间。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密耳秒
平均时间,用于创建输入流需要近5秒钟

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

任何想法为什么输入流花费很多时间,这使得整个服务非常慢?

回答

-1

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

类文档URLConnection.setConnectTimeout()说:

以毫秒为单位的最长等待时间,同时连接。如果在建立连接之前超时超时,连接到服务器将失败并返回SocketTimeoutException。默认值为0会导致我们执行阻止连接。这并不意味着我们永远不会超时,但这可能意味着您在几分钟后会收到TCP超时。

警告:如果主机名解析为多个IP地址,则此客户端将按RFC 3484顺序尝试每个IP地址。如果连接到这些 地址中的每一个都失败,则会在连接尝试引发异常之前经过多个超时。支持IPv6和 IPv4的主机名始终至少有2个IP地址。

我原本把我的矿设置为urlConnection.setConnectTimeout(30000);,然后改为urlConnection.setConnectTimeout(1000)。马上,我看到了更快的结果。

希望这会有所帮助!

+2

你的意思是你看到了更快的连接失败,当你得到它们时。很难看到这是如何解决OP的问题。 – EJP

0

这可能与JDK 7中引入的错误有关。“使用保持活动高速缓存时,HttpServer诱发1000 ms的延迟”。请参阅:

http://bugs.java.com/bugdatabase/view_bug.do?bug_id=8009548

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

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

只有当他在另一端使用'HttpServer'时。没有证据。建议的解决方法是多线程*服务器*,这又是无关紧要的。 – EJP

1

您没有在测量您认为正在测量的内容。在调用getInputStream()或getResponseCode()之前,没有任何内容会写入服务器。所以,你真的测量:

  • 连接时间
  • 传输时间
  • 处理时间在服务器

,当你认为你只是测量的getInputStream()的时间。

原因是HttpURLConnection通过缓冲所有输出来自动设置内容长度标头。您可以通过使用分块传输模式来避免这种情况。那么至少你会看到时间到了哪里。

+2

我们如何做到这一点? – georgiaboy82