4

完全なリクエストを受信せず、接続を閉じると、45 秒後にタイムアウトするサーバーがあります。を介してこのサーバーに接続しSocket、リクエストをソケットの に書き込みますOutputStream

Socket socket = new Socket("myhost", myPort);
PrintWriter out = new PrintWriter(socket.getOutputStream());
out.write(properRequestMessage);
out.flush();

ここでは、私の要求が適切であると仮定しています (私のプロトコルに従っています)。サーバーはファイルで応答することになっています。ソケット入力ストリームから読み取ろうとします:

BufferedReader response = new BufferedReader(new InputStreamReader(socket.getInputStream()));

String in;

while((in = response.readLine()) != null) {
    System.out.println(in);
}

ここのreadLine()ブロックは、私のサーバーが私の要求が適切に終了されていないと判断し、さらに待っているためだと思います。

ここで、45 秒が経過してサーバーがタイムアウトした場合、ブロックをreadLine()解除するか、Socketデフォルトのタイムアウト時間まで待機しますか?

4

3 に答える 3

6

これは、タイムアウト時のサーバーの動作によって異なります。接続を閉じると、それが表示されます。メッセージをログに記録するだけの場合は、何も表示されない可能性があります。

デフォルトの読み取りタイムアウトはありません。readLine() は永遠に待つことができます。

于 2012-12-19T16:46:15.050 に答える
1

サーバーがそのタイムアウトでソケットの端を閉じるreadLine()と、が返されnullます。

于 2012-12-19T16:47:41.540 に答える
1

このメソッドは、入力を受け取るか、基礎となるソケットのタイムアウトが終了するreadLine()までブロックされます。read()読み取りコマンドではなく、ソケット自体でタイムアウトを設定します。

Socket.setSoTimeout(int ms) .

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

実際に発生することは、サーバーがソケットを正しく閉じている場合、IOExceptionによってスローされる必要がある場合、サーバーの動作にも依存しますreadLine()。接続が閉じられていない場合、ソケットがタイムアウトするまで待機します。

于 2012-12-19T17:01:35.710 に答える