次のように、ノンブロッキング IO を使用して UDP パケットを取得する作業コードがあります。
DatagramChannel channel = DatagramChannel.open();
channel.socket().bind(new InetSocketAddress(AUDIO_PORT));
channel.configureBlocking(false);
while(true){
ByteBuffer packet = ByteBuffer.allocate(MAX_PACKET);
if(channel.receive(packet) != null){
//Got something!
...
}
...
}
それは完璧に機能します。今、私はまったく同じことをしようとしていますが、今回は次のようにセレクターを使用したいだけです:
//Create a datagram channel, bind it to port, configure non-blocking:
DatagramChannel channel = DatagramChannel.open();
channel.socket().bind(new InetSocketAddress(AUDIO_PORT));
channel.configureBlocking(false);
//Create a selector and register it:
Selector selector = Selector.open();
channel.register(selector, SelectionKey.OP_READ);
//Spin
while(true){
//If there's a packet available, fetch it:
if(selector.selectNow() >= 1){
//**CODE NEVER REACHES THIS POINT**
ByteBuffer packet = ByteBuffer.allocate(MAX_PACKET);
channel.receive(packet);
...
}
...
}
私が作成しているアプリケーションのために、(私の例では回転しているように見えますが) ノンブロッキング IO である必要があり、短いタイムアウトでのブロックは機能しません。また、セレクターも使用する必要があります。問題は、サーバーがアクティブにデバイスの AUDIO_PORT ポートにパケットを送信しているにもかかわらず、select() 操作が常に 0 を返すことです。セレクターの設定が間違っていますか? いくつかのステップが欠けていると思いますが、それを理解できません。