5

URL に GET 要求を送信し、そのページのコンテンツ全体をダウンロードするアプリケーションを作成しました。

クライアントは 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 3 ウェイ ハンドシェイクを使用して) 新しい TCP 接続が作成され、その接続で GET が送信されます。しかし、パフォーマンスを向上させるために、TCP 接続を再利用したいと考えています。

メソッドが呼び出されるたびに新しい URL オブジェクトを作成するので、これが機能する方法だと思います...

多分誰かが私がこれをより良い方法で行うのを手伝ってくれるでしょうか?

ありがとう!

4

2 に答える 2

6

HttpURLConnection 可能であれば、接続再利用します!

これが機能するには、主にサーバー側でいくつかの前提条件を満たす必要があります。これらの前提条件は、上記のリンク先の記事に記載されています。

于 2011-03-28T12:47:55.500 に答える
2

問題を発見!入力ストリームを正しく読み取っていませんでした。これにより、入力ストリーム オブジェクトがハングし、再利用できませんでした。

次のように定義しただけです。

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?

于 2011-03-29T17:39:58.240 に答える