我有使用非阻塞 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。我知道服务器应用程序正在工作,因为第一个片段工作正常。我是否设置了选择器错误?我猜我错过了一些步骤,但我无法弄清楚。