0

私は単純なクライアントを持っています-RESTAPIを介してファイルをダウンロードするサーバーアプリ。基本http認証を使用しているため、ファイルはssl経由で送信されます。

//my download loop
HttpsURLConnection conn;
//some handling of response codes and content-length
InputStream s = conn.getInputStream();
while (true) {
        i = br.read(buffer); //if server shuts down, I stall here
        if (i == -1)
            break;
        downloadedSize += i;
        fis.write(buffer, 0, i);

    }

これはすべて正常に機能し、サーバーがファイル転送をシャットダウンする状況がコードで発生するまで問題はありません。その時、コードは単にストールし、私には役に立たないスレッドがあります。

私の質問は、サーバーがシャットダウンされたことをどのように検出するかです。WiresharkでRST信号が送信されているのがわかりますが、例外は発生しません。これは私にはかなり一般的な作業のように思えますが、それでも私はそれに対する簡単な答えを見つけていません。

現在、スケジュールされたタスクを使用しています。これは、時々ダウンロードに進捗があったかどうかをチェックします。問題が検出されると、新しいworkerThreadが作成され、通信サービスにその問題を使用するように指示されます。

スレッドが孤立してしまう可能性があるため、これは非常に醜い解決策です。

available()を使用して、使用可能なデータがあるかどうかを確認しようとしましたが、これはSSLであるため、常に0を返します。

4

1 に答える 1

1

Iveがconn.setReadTimeout(5000);を呼び出していることが判明しました。間違った場所で

conn = getConnection(address);
    conn.setReadTimeout(5000);
    conn.setRequestMethod("GET");

これにより、read()が正しく失敗します。

于 2013-03-24T15:00:37.673 に答える