7

SuperSocket というソケット変数があるとします。タイムアウト例外をキャッチする方法はありますか?

       SuperSocket.setSoTimeout(5000);

       catch (SocketTimeoutException e){
        System.out.println("Timeout");
        System.exit(1);
    }
4

1 に答える 1

6

setSoTimeout()が、いつその例外がスローされるのか理解していないようです。

Javadoc から: ( http://docs.oracle.com/javase/6/docs/api/java/net/Socket.html )

public void setSoTimeout(int timeout)
は SocketException をスローします

ミリ秒単位で指定されたタイムアウトで SO_TIMEOUT を有効/無効にします。このオプションをゼロ以外のタイムアウトに設定すると、この Socket に関連付けられた InputStream での read() 呼び出しは、この時間だけブロックされます。タイムアウトになると、Socket は引き続き有効ですが、java.net.SocketTimeoutException が発生します。このオプションを有効にするには、ブロッキング操作に入る前に有効にする必要があります。タイムアウトは > 0 でなければなりません。ゼロのタイムアウトは、無限のタイムアウトと解釈されます。

がスローされるSocketTimeoutException(そしてキャッチされる) のは、Socketの基になるブロックで読み取りを実行していてInputStream、指定された時間内にデータが受信されない (読み取りが ... タイムアウトになる) 場合のみです。

superSocket.setSoTimeout(5000);
InputStream is = superSocket.getInputStream();
int i;
try {
    i = is.read();
} catch (SocketTimeoutException ste) {
    System.out.println("I timed out!");
}

追加する編集:実際には、例外がスローされる可能性のある別の時間があり、それはSocket.connect()、タイムアウトを指定する場所の2つの引数バージョンを呼び出している場合です。

于 2012-12-06T06:02:48.833 に答える