当前位置: 首页 > 知识库问答 >
问题:

HttpURL连接。getInputStream非常慢

令狐宣
2023-03-14

HttpURL连接。与使用相同服务器端服务的iPhone应用程序相比,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) {

        }

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

该过程的平均时间如下:

发送到服务器的平均时间不到2百万秒< br >创建输入流的平均时间几乎需要5秒

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

知道为什么输入流要花很多时间,使得整个服务非常慢吗?

共有3个答案

岳曦
2023-03-14

这可能与JDK 7中引入的错误有关。“使用keep-alive缓存时,HttpServer会导致1000毫秒延迟”。请参见:

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

根据您的目的,建议的解决方法是对网络连接进行多线程处理。例如,如果您使用的是 Http 服务器,则可以执行以下操作:

server.setExecutor( Executors.newFixedThreadPool( 5 ) );
席银龙
2023-03-14

将“连接时间”() 设置为较低的超时值。

URLConnection.setConnectTimeout()的类留档说:

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

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

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

希望这有帮助!

勾长卿
2023-03-14

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

  • 连接时间
  • 传输时间
  • 服务器的流转时长

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

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

 类似资料:
  • 我使用的是David Walsh的脚本,它通过IMAP连接到Gmail,并在屏幕上输出电子邮件数据。 我已经运行了两个测试案例: 使用 IMAP 从我自己的域读取电子邮件。 使用 IMAP 从 gmail 读取电子邮件。 读120封邮件的时间差别很大。对于Gmail,整个脚本需要大约5秒,其中1.2秒连接,3.8秒阅读邮件,0.1629秒连接,0.0238秒阅读邮件。 这些价值观与我的预期大相径庭

  • 我有一个带有API的网站,我用它来获取JSON数据。我有一个类,每次发送请求时都会创建该类的一个实例。创建的实例时,将创建一个新的对象,ed和ed: 然而,我需要在一个循环中发送10个这样的请求。每个请求大约需要1.3秒,而所有10个请求加起来不应超过1-2秒。我发现大部分时间都花在获取输入流和处理它上:

  • 代码片段如下所示: 如果有人有决议,请帮忙?

  • 问题内容: 我想创建一个非阻塞连接。像这样: 为此,我使用了另一个线程,无限循环和Linux epoll。像这样(伪代码): 如果我先运行服务器,然后运行客户端,那么一切正常。如果我先运行客户端,请稍等一会儿,再运行服务器,然后客户端将无法连接。 我究竟做错了什么?也许可以做不同的事情? 问题答案: 您应该使用以下步骤进行异步连接: 用创建套接字 开始与 如果返回值既不是也不是,则中止并返回错误

  • 以下错误在连接 sqlserver(java) 时抛出。我不知道这个问题的根本原因。 如果有人遇到这个问题,请让我们知道,如何解决这个问题?

  • 这是我第一次使用RMI,基本上我设法在我的PC本地运行下面的RMI示例,但不是通过两个独立的Linux机器。 服务器界面: 服务器: 客户: 客户端接口与服务器接口相同 这是我为了运行rmi示例所做的: 1) 在服务器端,我创建了存根 2) 跑马场 3)运行服务器 4)我将存根从服务器端复制到客户端到同一个包中 5) 运行客户端 运行客户端后,我收到以下错误消息: 线程“main”java中出现异