【问题标题】:Is an HttpURLConnection's InputStream part of the connection process?HttpURLConnection 的 InputStream 是连接过程的一部分吗?
【发布时间】:2011-11-10 04:55:12
【问题描述】:

我有一个 Java 程序,它使用 OAuth 与服务器通信以检索 XML 数据。

它利用Signpost OAuth库与源连接,并使用标准的InputStream读取方式来访问返回的XML。

最近,我注意到检索信息所花费的时间很慢,测试表明某些请求可能需要 2000 毫秒到 10000 毫秒(如果重要的话,源服务器在欧洲,我是在澳大利亚)。

我在 OAuth 通信 (request.connect()) 之后添加了一个时间戳,在读取 InputStream 之后又添加了一个时间戳,这是输出:

Request #1: Communication: [6351ms] Data process: [403ms] Total: [6754ms]
Request #2: Communication: [1ms] Data process: [3121ms] Total: [3122ms]
Request #3: Communication: [1ms] Data process: [1297ms] Total: [1298ms]
Request #4: Communication: [0ms] Data process: [539ms] Total: [539ms]
  • 请求#4 实际上是请求#2 正在第二次运行。所有请求都在程序的一次运行中发出(没有停止和启动)。

我的问题:InputStream 作为 HttpURLConnection 对象的一部分返回到 connect() 方法,还是在我从中读取时返回(顾名思义)以及实际连接过程的一部分?

第二个问题:根据上面的时间,慢的时间最有可能是服务器问题还是我读取 InputStream 的方法有问题?

供参考,这里是有问题的代码:

long startTime = System.currentTimeMillis();
URL url = new URL(urlString);
HttpURLConnection request = (HttpURLConnection) url.openConnection();
consumer.sign(request);
request.connect();

long connectionTime = System.currentTimeMillis();

InputStream is = request.getInputStream();
if (is != null) {
    final BufferedReader bufferedreader = new BufferedReader(
              new InputStreamReader(is, "UTF-8"));
    final StringBuffer s2 = new StringBuffer();
    String line;
    line = bufferedreader.readLine();
    if (line != null) {
        s2.append(line);
        while ((line = bufferedreader.readLine()) != null) {
            s2.append('\n');
            s2.append(line);
        }
    }
    bufferedreader.close();
    rv = s2.toString();
}
long finishTime = System.currentTimeMillis();
long timeTaken = finishTime - startTime;
long totalConnectionTime = connectionTime - startTime;
long processDataTime = finishTime - connectionTime;
String info = "Communication: [" + totalConnectionTime + 
                    "ms] Data process: [" + processDataTime + 
                    "ms] Total: [" + timeTaken + "ms]";

提前致谢。

【问题讨论】:

  • 您是否尝试过计算独立于您的应用程序需要多长时间才能获得响应?例如(在 *nix 中)wget,或者大约在浏览器中?
  • 您可以通过分析器运行您的代码来消除所有猜测。它很可能会告诉您瓶颈是在您的代码中还是在网络中

标签: java performance inputstream httpurlconnection


【解决方案1】:

根据所提供的信息,这里有一些意见和建议。

  1. 为了回答您的问题,当您从中读取数据时,数据会流回。然后你在它的顶部有缓冲层。不返回整个数据并对其进行流式传输。希望我正确阅读了您的问题。
  2. 第二个问题:这两个地方所花费的时间都可以。服务器和您的代码中也是如此。由于除了读取数据之外,您没有在代码中进行任何其他处理(Bufferedreader.close()s2.toString(); 除外),因此延迟似乎在服务器中,但只是为了确保,如果可能,请使用任何浏览器点击 URL 并查看获取请求所花费的时间。 (从代码中我看到您只是从 URL 获取数据,因此应该很容易使用浏览器访问相同的数据)
  3. 您还提到您正在从服务器检索 XML。我建议使用一些经过优化(因此性能更好)的标准 xml 解析器(SAX、xstrem 等),用于从 InputStream 读取 xml 数据。

【讨论】:

    【解决方案2】:

    openConnection() 确实会创建 TCP 连接,但除非您使用非默认流模式,否则在您获得输入流或读取器或响应代码之前不会发送数据。因此,在您的情况下,发送请求被视为getInputStream() 的一部分。

    【讨论】:

    • 感谢您的回答。不幸的是,我不能正确地标记两个答案,所以我也选择了回答我第二个问题的那个。 :)
    猜你喜欢
    • 1970-01-01
    • 2013-02-27
    • 2022-01-10
    • 2020-06-25
    • 2013-05-06
    • 2017-05-11
    • 2012-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多