2012-04-03 7 views
0

whileループのスニペットが以下のようになるソケットアプリケーションがあります。私たちが確認したいのは、30秒以上経過してもデータがなくなったらソケット接続をシャットダウンするということです。イベントでは、いくつかのデータがある場合、私たちはタイマーをリセットします。タイマまたはシステムのミリ秒を使用する必要がありますタイマーはソケット接続のアクティビティをチェックしますか?

while ((readChar=readSocket.read()) != -1) 
{ 

    //processing. 
} 

答えて

2

指定した間隔内にデータが受信されないと、読み取り操作がタイムアウトするようにソケットを構成できます。 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 
} 
+0

ここでsocket.setSoTimeoutの問題は、例えば、ソケットが閉じる30秒後に30秒を設定した場合です。私が必要としたのは、長いデータが入ってくるだけでそれを受け取るようになっているからです。このバッチの最後のデータの後の瞬間、タイマーを設定して30秒以内にデータがなくなったらソケットだけを切断したいのですか? – user837306

+0

SO_TIMEOUTは、30秒間経過してもデータが受信されなかった場合にSocketTimeoutExceptionを発生させます。(a)データ*が受信された場合、タイムアウトは期限切れではなく、(b)ソケットを閉じます。データが到着したら、データが到着してから30秒待ってからソケットを閉じてください。もしそうなら、上記のコードにいくつかのチェックを追加して、私たちが「初期」または「データ受信後」の状態にあるかどうかを判断することで達成できます。 –

+0

最初は接続を行い、区切り文字で文字を読み続ける#。だから私はハッシュを参照してください私は1つの完全なデータ/行を読んだことを意味します。その後、私は30秒で待つ必要があります。私は今はっきりしていると思う。開始から30秒以内にデータが届かない場合は、無期限にブロックしたくありません。 – user837306

1

非同期NIO操作を使用してください。 java6を使用する場合、非同期操作は難しいですが、かなり重いですが、ネットワークライブラリ(Mina、Netty)が多数あります。 java7を使用すると、真の非同期ネットワーク操作が実装され、使いやすい(nio2)。さらに簡単に、https://github.com/rfqu/df4jの軽量nio2ライブラリを使用することができます。

関連する問題