我正在编写一个连接到服务器的安卓应用程序(>= 2.3),我在NIO选择器上遇到了问题。
Selector selector = SelectorProvider.provider().openSelector();
SocketChannel socketChannel = SocketChannel.open();
socketChannel.configureBlocking(false);
socketChannel.register(selector, SelectionKey.OP_READ);
selector.select(); // returns 0 immediately根据Android文档的说法
公共摘要int 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选择的键。如果没有选定的键,我就无法决定下一步该做什么。(同样,当select()返回API文档中描述的内容时,这种情况不属于三种类别之一。)
发布于 2013-05-05 21:20:02
在注册之前,尝试将套接字连接到某个地方。要么在将其放入非阻塞模式之前就这样做,要么在之后这样做,但是注册OP_CONNECT而不是OP_READ,并在触发时调用finishConnect():如果它返回true,则取消注册OP_CONNECT并注册OP_READ。
https://stackoverflow.com/questions/16386342
复制相似问题