2010-11-18 10 views
2

NIOの出現により、ほとんどのソケットタイプはSelectableChannel実装によって「選択可能」になります。残念ながら、DatagramChannelはJava 7より前のマルチキャストをサポートしていません。マルチキャストは、MulticastSocketクラスを介して以前のバージョンでサポートされていたです。選択可能なマルチキャストソケット(前1.7)

マルチキャストデータグラムソケットに保留中のメッセージ(つまり読み取り可能な)メッセージがあることを検出できるようにしたいと考えています。私は即時の時間枠の中に残りのデータグラムがなくなるまで読むことを望みます。すべての保留中のメッセージを受信した後、コールバックを呼び出すが、個別にまたはすべての保留中のメッセージを読み取る前に呼び出すこと

これを簡単にして、1つのソケットを想定します。擬似コードで:

List<Msg> received = new ArrayList<Msg> 
while (true) 
{ 
    received.clear(); 
    // initial blocking receive 
    data = receive_blocking (socket, datagram) 
    received.add (new Msg(data)); 

    // flush out remaining messages 
    for (boolean receiving = true ; receiving ;) 
    { 
     // non-blocking 
     if (receive_nonblocking (socket, datagram)) 
      received.add (new Msg(datagram)); 
     else 
      receiving = false; 
    } 

    callback (received); 
} 

質問は、私はセレクタメカニズムを必要とするが、私は非ブロッキング読み取り(複数可)を行うか、そうでなければすることができますいくつかの方法があるかどうかを疑問に思っていないNIO 2.なしreceive_nonblockingを実装する方法であります保留中のものがあるかどうかを検出する。

セレクタを使用すると、ソケット作成後にチャネルを取得するのではなく、チャネルを直接new DatagramChannel()のように作成する必要があります。したがって、正しい場合は、socket.getChannel()を使用してセレクタポストソケット作成を作成できませんでした。

これはJNIやタイマーが含まれていないため、Java 7より前ですか?

答えて

1

非常に短い読み取りタイムアウトを設定して、SocketTimeoutExceptionをキャッチします。これは、有効期限が切れたときにスローされ、読み取りループから抜け出します。

+0

ありがとう、私はSO_TIMEOUTが適用可能であることを認識しませんでした。 unix io​​ctl()のようなノンブロッキング設定を探していました。 –

関連する問題