Является ли InputStream HttpURLConnection частью процесса подключения? - PullRequest
0 голосов
/ 10 ноября 2011

У меня есть программа на 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 голосов
/ 10 ноября 2011

openConnection() создает TCP-соединение, но если вы не используете режим потоковой передачи не по умолчанию, никакие данные не отправляются, пока вы не получите ни входной поток, ни считыватель, ни код ответа. Таким образом, отправка запроса рассматривается как часть getInputStream() в вашем случае.

0 голосов
/ 10 ноября 2011

Основываясь на предоставленной информации, вот несколько замечаний и предложений.

  1. Чтобы ответить на ваш вопрос, данные возвращаются обратно , когда вы читаете их.И тогда у вас есть буферные слои поверх него.Все данные не возвращаются и передаются в потоковом режиме.Я надеюсь, что я правильно прочитал ваш вопрос.
  2. Дополнительный вопрос: время, затраченное в обоих местах, а именно.сервер и в вашем коде, а также.Поскольку вы не выполняете никакой другой обработки в своем коде, кроме чтения данных (кроме Bufferedreader.close() и s2.toString();), задержка, по-видимому, на сервере, НО просто для того, чтобы быть уверенным, если это возможно, нажать URL-адрес с помощью любого браузера и увидетьвремя, необходимое для получения запроса.(из кода я вижу, что вы просто извлекаете данные из URL и, следовательно, вам должно быть легко получить доступ к ним с помощью браузера)
  3. Вы также упомянули, что извлекаете XML с сервера.Я бы рекомендовал использовать некоторые стандартные синтаксические анализаторы xml (SAX, xstrem и т. Д.), Которые оптимизированы (а следовательно, и обеспечивают более высокую производительность) для чтения XML-данных из InputStream.
.
...