TCP-соединение не используется повторно для HTTP-запросов с HttpURLConnection - PullRequest
4 голосов
/ 28 марта 2011

Я создал приложение, которое отправляет GET-запросы на URL, а затем загружает все содержимое этой страницы.

Клиент отправляет GET, например, на stackoverflow.com и пересылает ответ анализатору, который может найти все источники со страницы, которые необходимо загрузить с последующими запросами GET.

Метод ниже используется для отправки этих запросов GET. Он вызывается много раз подряд с URL-адресами, возвращаемыми парсером. Большинство из этих URL-адресов расположены на одном хосте и должны иметь возможность совместно использовать TCP-соединение.

public static void sendGetRequestToSubObject(String RecUrl)
    {
        URL url = new URL(recUrl.toString());
        URLConnection connection = url.openConnection ();
        InputStreamReader isr = new InputStreamReader(connection.getInputStream());
    }

Каждый раз, когда вызывается этот метод, создается новое TCP-соединение (с трехсторонним рукопожатием TCP), а затем по этому соединению отправляется GET. Но я хочу повторно использовать TCP-соединения для повышения производительности.

Я предполагаю, что, поскольку я создаю новый объект URL каждый раз, когда вызывается метод, именно так он и будет работать ...

Может быть, кто-то может помочь мне сделать это лучше?

Спасибо!

Ответы [ 2 ]

6 голосов
/ 28 марта 2011

HttpURLConnection будет повторно использовать соединения , если возможно !

Чтобы это работало, необходимо выполнить несколько предварительных условий, в основном на стороне сервера. Эти предварительные условия описаны в статье, указанной выше.

2 голосов
/ 29 марта 2011

Нашел проблему! Я не читал поток ввода правильно. Это привело к зависанию объектов входного потока, и они не могли быть повторно использованы.

Я только определил это так:

InputStreamReader isr = new InputStreamReader(connection.getInputStream());

но я никогда не читаю: -)

Я также изменил метод чтения. Вместо буферизованного ридера я украл это:

InputStream in = null; 
String queryResult = "";
try {
     URL url = new URL(archiveQuery);
     HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
     HttpURLConnection httpConn = (HttpURLConnection) urlConn;
     httpConn.setAllowUserInteraction(false);
     httpConn.connect();
     in = httpConn.getInputStream();
     BufferedInputStream bis = new BufferedInputStream(in);
     ByteArrayBuffer baf = new ByteArrayBuffer(50);
     int read = 0;
     int bufSize = 512;
     byte[] buffer = new byte[bufSize];
     while(true){
         read = bis.read(buffer);
         if(read==-1){
           break;
         }
         baf.append(buffer, 0, read);
     }
     queryResult = new String(baf.toByteArray());
     } catch (MalformedURLException e) {
          // DEBUG
          Log.e("DEBUG: ", e.toString());
     } catch (IOException e) {
          // DEBUG
          Log.e("DEBUG: ", e.toString());
     } 
}

Отсюда: Чтение HttpURLConnection InputStream - ручной буфер или BufferedInputStream?

...