7

与使用相同服务器端服务的 iPhone App 相比,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 百万秒。

关于为什么输入流需要很多时间导致整个服务非常慢的任何想法?

4

3 回答 3

1

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

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

当您认为您只是在测量 getInputStream() 时间时。

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

于 2014-10-10T23:36:52.137 回答
0

这可能与 JDK 7 中引入的错误有关。“HttpServer 在使用 keep-alive 缓存时会产生 1000 毫秒的延迟”。看:

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

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

server.setExecutor( Executors.newFixedThreadPool( 5 ) );
于 2014-03-14T03:46:28.630 回答
0

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

URLConnection.setConnectTimeout() 的类文档说:

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

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

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

希望这可以帮助!

于 2013-11-21T13:10:16.057 回答