11

URL のコンテンツを読み取りたいが、URL が応答しない場合に「ハング」したくありません。URLを使用してBufferedReaderを作成しました...

URL theURL = new URL(url);
URLConnection urlConn = theURL.openConnection();
urlConn.setDoOutput(true);
BufferedReader urlReader = new BufferedReader(newInputStreamReader(urlConn.getInputStream()));

...そして、コンテンツを読み取るループを開始しました...

do
    {
    buf = urlReader.readLine();
    if (buf != null)
        {
        resultBuffer.append(buf);
        resultBuffer.append("\n");
        }
    }
while (buf != null);

...しかし、読み取りがハングすると、アプリケーションがハングします。

必要に応じて読み取りを「タイムアウト」する方法はありますか?

4

5 に答える 5

13

URLConnection.setReadTimeout が探しているものだと思います。

于 2008-09-18T15:08:51.147 に答える
3

Java 1.4 を使用している場合:

URLConnection.setConnectTimeout(int timeout)ある種のストリーミングを行っているため、接続タイムアウト ( ) は役に立たないと思います。

---スレッドを強制終了しないでください--- 不明な問題、オープン記述子などを引き起こす可能性があります。

プロセスが終了したかどうかを確認する java.util.TimerTask を生成します。完了していない場合は、URLConnection の BufferedReader と OutputStream を閉じます。

ブール値フラグisFinishedを挿入し、ループの最後に true に設定し、ループの前に false に設定します

TimerTask ft = new TimerTask(){
   public void run(){
     if (!isFinished){
       urlConn.getInputStream().close();
      urlConn.getOutputStream().close();
     }
   }
};

(new Timer()).schedule(ft, timeout);

これはおそらく ioexception を引き起こすので、キャッチする必要があります。例外自体は悪いことではありません。匿名クラスが変数にアクセスできるように、いくつかの宣言 (つまり、finals) を省略しています。そうでない場合は、参照を保持する POJO を作成し、それを timertask に渡します。

于 2008-09-18T15:28:58.290 に答える
2

Java 1.5 以降、URLConnection クラスの「setReadTimeout(int timeout)」メソッドを介して、基になるソケットの読み取りタイムアウトをミリ秒単位で設定できます。

リモートサーバーへの最初の接続で同じことを行う「setConnectTimeout(int timeout)」もあることに注意してください。これも同様に設定することが重要です。

于 2008-09-18T15:12:22.557 に答える
1

Java 1.4の場合、ApacheのSimpleHttpConnectionManager.getConnectionWithTimeout(hostConf、CONNECTION_TIMEOUT)を使用できます。

于 2012-11-26T06:52:22.697 に答える
1

私は最近、JVM 1.4 環境でこの問題に取り組んでいます。標準的な答えは、システム プロパティ sun.net.client.defaultReadTimeout (読み取りタイムアウト) および/または sun.net.client.defaultConnectTimeout を使用することです。これらはNetworking Propertiesに記載されており、Java コマンド ラインの -D 引数または System.setProperty メソッド呼び出しを介して設定できます。

おそらく、これらは実装によってキャッシュされるため、あるものから別のものに変更することはできないため、一度使用されると値が保持されます。

また、HttpsURLConnection などの SSL 接続では実際には機能しません。カスタム SSLSocketFactory を使用してこれに対処する方法は他にもあります。

繰り返しますが、これはすべて JVM 1.4.x に当てはまります。1.5 以降では、API で使用できるメソッドが増えています (上記の他のレスポンダーが指摘しているように)。

于 2008-09-30T22:19:16.000 に答える