HttpURLConnection的InputStream是连接过程的一部分吗?

时间:2011-11-10 04:55:12

标签: java performance inputstream httpurlconnection

我有一个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]";

提前致谢。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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