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

Java HttpURLConnection的InputStream是连接过程的一部分吗?,java,performance,inputstream,httpurlconnection,Java,Performance,Inputstream,Httpurlconnection,我有一个Java程序,它使用OAuth与服务器通信来检索XML数据 它使用Signpost OAuth库与源代码连接,并使用读取InputStream的标准方式访问返回的XML 最近,我注意到检索信息所花的时间很慢,测试表明,一些请求可能需要2000毫秒到10000毫秒不等,如果有必要,源服务器在欧洲,我在澳大利亚 我在OAuth communication request.connect之后以及在读取InputStream之后添加了一个时间戳,下面是输出: Request #1: Commun

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

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

最近,我注意到检索信息所花的时间很慢,测试表明,一些请求可能需要2000毫秒到10000毫秒不等,如果有必要,源服务器在欧洲,我在澳大利亚

我在OAuth communication 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是作为connect方法的一部分返回到HttpURLConnection对象的,还是按照名称所示,在我读取时流式返回到HttpURLConnection对象,并且是实际连接过程的一部分

第二个问题:根据上面的时间安排,最可能是服务器或我读取输入流的方法出现问题的时间慢吗

以下是相关代码,供参考:

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]";

提前感谢。

根据提供的信息,以下是一些观察和建议

为了回答您的问题,当您从中读取数据时,数据会流式返回。然后在上面有缓冲层。不会返回整个数据并流式传输。我希望我没看错你的问题。 第二个问题:在这两个地方,即。服务器和您的代码中也有。因为您在代码中除了读取Bufferedreader.close和s2.toString之外,没有进行任何其他处理;延迟似乎出现在服务器中,但只是为了确保,如果可能,请使用任何浏览器点击URL并查看获取请求所花费的时间。从代码中,我看到您只是从URL获取数据,因此使用浏览器应该很容易访问相同的URL 您还提到您正在从服务器检索XML。我建议使用一些标准的xml解析器SAX、xstrem等,这些解析器经过优化,因此在从InputStream读取xml数据时具有更好的性能。
openConnection确实创建TCP连接,但除非使用非默认流模式,否则在获得输入流、读取器或响应代码之前,不会发送任何数据。因此,在您的情况下,发送请求被视为getInputStream的一部分。

您是否尝试过独立于应用程序来计时获得响应所需的时间?e、 在*nix wget中,或者大约在浏览器中?您可以通过探查器运行代码来消除所有猜测。它很可能会告诉您瓶颈是在代码中还是在网络中谢谢您的回答。不幸的是,我不能把两个答案都标对,所以我也选择了回答我第二个问题的那个