2011-10-25 3 views
4

私はソケット接続を使って回線を送信し、その後、サーバからの回線を45秒間待つソケットクライアントを作成しています。バッファ付きリーダーを使用してフルラインを読み取っている場合、ソケットのタイムアウトを設定することはできますか?

私はそうのようなバッファリングリーダー使用しています:私は次の行(またはそのようなもの)を追加した場合は何も持っていないと仮定して45秒後にどうなる

socket.setSoTimeout(45000); 

Socket socket = null; 
PrintWriter out = null; 
BufferedReader in = null; 
try { 
      socket = new Socket(host, 800); 
      out = new PrintWriter(socket.getOutputStream(), true); 
      in = new BufferedReader(new InputStreamReader(
             socket.getInputStream())); 
} catch (UnknownHostException e) { 
      listener.failedToConnectToHost(e); 
      return; 
} catch (IOException e) { 
      listener.failedToConnectToHost(e); 
     return; 
} 

     BufferedReader stdIn = new BufferedReader(
       new InputStreamReader(System.in)); 
     out.println("message"); 
try { 
     String response = in.readLine(); 
     listener.responseRecived(response); 
     return; 
} catch (IOException e) { 
     listener.errorReadingResponse(e); 
     return; 
} 

をもう一端から来る?

私は中断された例外をキャッチしていると思いますが、私は確信していますか?

これは動作しますか? setSOTImeOut()のドキュメントは、タイムアウトするsocket.read()を意味します。バッファリングされた読者がスタックのどこかを呼び出していると仮定していますが、仮定はすべてのスクラップの母です。

+1

あなたはそれを自分でテストしませんか?私はTCP connが閉じて、あなたはEOFExceptionを取得するだろうと思う。 –

+0

@VictorSorokinなぜ接続が閉じますか? – EJP

+0

'私は仮定します...'どのように正確にreadLine()*できない*ソケットから読み取ることによって進行することができますか? – EJP

答えて

3

BufferedReader.readLine()メソッドは、45秒後にSocketTimeoutExceptionをスローします。

+1

おかげで、私は怠け者になっていて、自分の同僚が自分でテストすることに疑問を抱いたときに罪悪感を味わっていました。同じ結果が得られました。 –

+0

これはチェックされた例外なので、あなたはそれをキャッチするか、とにかく宣言します。これはIOExceptionのサブクラスなので、すでに処理しているようです。 –

+0

それはおそらく私は別の例外があったことを知らなかったのです。タイムアウトを特別に扱うブロックがあります。 –

0

明らかに動作し、SocketTimeoutExceptionが発生します。

関連する問題