1

指定された ip とポートでリッスンしているサーバーと、そのサーバーに接続するクライアントがあるシナリオがあります。今、私はreadlineメソッドを使用してサーバーからの応答を読んでいます:

String readme=bs.readline()).   

こちらbsbufferedreaderオブジェ。この行を書いた場合、応答を読む前に知りたい

socket.setSoTimeout(1000)

1000ミリ秒まで応答がない場合

ソケットがタイムアウトして切断されるか、ソケットを切断せずに空の文字列を与えるかreadme

4

2 に答える 2

5

実際にはどちらでもありません。ASocketTimeoutExceptionがスローされます。

ドキュメントから:

setSoTimeout

public void setSoTimeout(int timeout)
                  throws SocketException

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

パラメータ: timeout -指定されたタイムアウト(ミリ秒単位)。 スロー:-TCP SocketExceptionエラーなど、基盤となるプロトコルにエラーがある場合。

于 2012-08-09T14:51:08.233 に答える
1

ソケットは切断されません。代わりに、読み取りメソッドは、プログラムでキャッチしたい場合がある SocketTimeoutException をスローします。ソケットは引き続き使用できますがreadme、その場合は定義されません。

String readme;
try
{
 readme = bs.readline;
// TODO do stuff with readme
}
catch (SocketTimeoutException e)
{
// did not receive the line. readme is undefined, but the socket can still be used
 socket.close(); // disconnect, for example
}

IOExceptionこの例では、 s が他の場所でキャッチされるか、スローされることが想定されています。

ドキュメントは、この動作を非常によく説明しています: Socket.setSoTimeout(int)

于 2012-08-09T14:50:01.673 に答える