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より前ですか?
ありがとう、私はSO_TIMEOUTが適用可能であることを認識しませんでした。 unix ioctl()のようなノンブロッキング設定を探していました。 –