web-dev-qa-db-ja.com

Java)の永続的なHttpURLConnection

お気に入りのウェブコミックを自動的にダウンロードして名前を付けるJavaプログラムを作成しようとしています。同じドメインから複数のオブジェクトをリクエストするため、永続的なhttp接続が必要でした。すべての漫画がダウンロードされるまで開いたままにしておくことができます。以下は進行中の作業です。新しいhttp接続を開かずに、同じドメインで異なるパスから別のリクエストを行うにはどうすればよいですか?

import Java.io.BufferedReader;
import Java.io.IOException;
import Java.io.InputStreamReader;
import Java.net.HttpURLConnection;
import Java.net.URL;

public class ComicDownloader
{
    public static void main(String[] args)
    {
        URL url = null;
        HttpURLConnection httpc = null;
        BufferedReader input = null;

        try
        {
            url = new URL("http://www.cad-comic.com/cad/archive/2002");
            httpc = (HttpURLConnection) url.openConnection();
            input = new BufferedReader(new InputStreamReader(httpc.getInputStream()));
            String inputLine;

            while ((inputLine = input.readLine()) != null)
            {
                System.out.println(inputLine);
            }

            input.close();
            httpc.disconnect();
        }
        catch (IOException ex)
        {
            System.out.println(ex);
        }
    }
}
19
Githaron

ここのドキュメント によると、HTTPの持続性はJavaで透過的に処理されていますが、http.keepAliveおよびhttp.maxConnectionsシステムプロパティを介してそれを制御するオプションもあります。

しかしながら、

現在の実装では、応答本文はバッファリングされません。つまり、その接続を再利用するには、アプリケーションが応答本文の読み取りを終了するか、close()を呼び出して、応答本文の残りの部分を破棄する必要があります。さらに、現在の実装では、接続をクリーンアップするときにブロック読み取りを試行しません。つまり、応答本文全体が使用できない場合、接続は再利用されません。

リンクを見て、それが本当に役立つかどうかを確認してください。

18
yclian

このリンクによると http://docs.Oracle.com/javase/6/docs/technotes/guides/net/http-keepalive.html 、HTTP接続の再利用はデフォルトで有効になっています。 Wiresharkを使用して、クライアントとサーバー間の相互作用を確認します。最初のリクエストにはTCPとSSLハンドシェイク(リクエストがhttpsの場合)が含まれ、キープアライブ時間に発生する後続のリクエストにはTCPとSSLハンドシェイク、アプリケーションデータ転送のみ。

4
allen zhang