我正在编写一款 Android 应用程序(版本号>=2.3),它连接到服务器,但我在使用 NIO 选择器时遇到了问题。
根据Android API文档,select()方法不会返回直到至少有一个通道准备好、wakeup()被调用或者调用线程被中断。如果没有以上任何情况发生但是它返回了,那么select()方法的行为与规范描述不符,我认为这是一个bug。 编辑 根据EJP在下面的评论,我已经修改了代码。
Selector selector = SelectorProvider.provider().openSelector();
SocketChannel socketChannel = SocketChannel.open();
socketChannel.configureBlocking(false);
socketChannel.register(selector, SelectionKey.OP_READ);
selector.select(); // returns 0 immediately
根据Android API文档,select()方法不会返回直到至少有一个通道准备好、wakeup()被调用或者调用线程被中断。如果没有以上任何情况发生但是它返回了,那么select()方法的行为与规范描述不符,我认为这是一个bug。 编辑 根据EJP在下面的评论,我已经修改了代码。
socketChannel.register(selector, SelectionKey.OP_CONNECT);
socketChannel.connect(serverAddress);
while (true) {
selector.select();
for (SelectionKey key: _selector.selectedKeys()) {
if (key.isConnectable())
finishConnect(key);
...
}
selector.selectedKeys().clear();
}
当服务器正在运行时,它可以工作:select()会返回1个已选择的键,我可以调用finishConnect()来建立连接。但是如果服务器未运行,则连接被拒绝,select()将返回0个已选择的键。如果没有已选择的键,则无法确定下一步该做什么。(再次说明,这种情况不属于API文档中描述的select()返回的3种类别之一。)