我有一段使用非阻塞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。我知道服务器应用程序正在工作,因为第一个代码片段运行良好。我设置选择器的方式错了吗?我猜我漏掉了一些步骤,但我就是想不出来。