指定した間隔内にデータが受信されないと、読み取り操作がタイムアウトするようにソケットを構成できます。 the Socket Javadocから
:
public void setSoTimeout(int timeout) throws SocketException
ミリ秒単位で指定されたタイムアウトでSO_TIMEOUTを有効/無効にします。このオプションをゼロ以外のタイムアウトに設定すると、このSocketに関連付けられたInputStreamのread()呼び出しは、この時間だけブロックされます。タイムアウトが経過すると、Socketはまだ有効ですが、java.net.SocketTimeoutExceptionが発生します。有効にするには、ブロッキング操作を入力する前にオプションを有効にする必要があります。タイムアウトは> 0でなければなりません。ゼロのタイムアウトは無限のタイムアウトとして解釈されます。このアプローチを使用
Parameters:
timeout - the specified timeout, in milliseconds.
Throws:
SocketException - if there is an error in the underlying protocol, such as a TCP error.
Since:
JDK 1.1
See Also:
getSoTimeout()
、あなたは、データを読み取ることができます(但しへのあなたの必要性を)それを消費して、再度ソケットから読み取ります。タイムアウト例外が発生した場合は、ソケットを閉じます。
socket.setSoTimeout(30 * 1000); // timeout after 30 seconds
try
{
while ((readChar=readSocket.read()) != -1) // block reading data ...
{
// processing ...
}
}
catch (SocketTimeoutException e) // we didn't get any data within 30 seconds ...
{
socket.close(); // ... close the socket
}
ここでsocket.setSoTimeoutの問題は、例えば、ソケットが閉じる30秒後に30秒を設定した場合です。私が必要としたのは、長いデータが入ってくるだけでそれを受け取るようになっているからです。このバッチの最後のデータの後の瞬間、タイマーを設定して30秒以内にデータがなくなったらソケットだけを切断したいのですか? – user837306
SO_TIMEOUTは、30秒間経過してもデータが受信されなかった場合にSocketTimeoutExceptionを発生させます。(a)データ*が受信された場合、タイムアウトは期限切れではなく、(b)ソケットを閉じます。データが到着したら、データが到着してから30秒待ってからソケットを閉じてください。もしそうなら、上記のコードにいくつかのチェックを追加して、私たちが「初期」または「データ受信後」の状態にあるかどうかを判断することで達成できます。 –
最初は接続を行い、区切り文字で文字を読み続ける#。だから私はハッシュを参照してください私は1つの完全なデータ/行を読んだことを意味します。その後、私は30秒で待つ必要があります。私は今はっきりしていると思う。開始から30秒以内にデータが届かない場合は、無期限にブロックしたくありません。 – user837306