先决条件:Android 2.2模拟器。Android套接字上的选择器行为奇怪
我有一个完美工作的Java代码,它也是针对Android完美编译的。但是有一些奇怪的部分。特别是,似乎java.nio.Selector根本不起作用。
连接期间出现第一个问题。以下代码适用于Java,但不适用于Android(详情请参阅下文)。
socketChannel.configureBlocking(false);
socketChannel.connect(new InetSocketAddress(remoteAddr, getRemotePort()));
Selector selector = Selector.open();
socketChannel.register(selector, socketChannel.validOps());
// Wait for an event
int selRes = selector.select(timeout);
if (selRes == 1)
{
SelectionKey selKey = (SelectionKey)selector.selectedKeys().iterator().next();
if (selKey.isValid() && selKey.isConnectable()) {
// Get channel with connection request
boolean success = socketChannel.finishConnect();
if (!success) {
selKey.cancel();
}
}
}
我通过的30000(毫秒,这是30秒)超时,但选择立即返回selres等于0(在桌面上的Java它是1)。切换到阻塞模式的套接字工作正常(所以地址,端口和其他东西都可以)。
好吧,我离开了连接阻塞(现在)。但现在我的接受停止工作 - 选择器不报告传入连接。同样,通过使用阻塞套接字来摆脱Selector的作用。
所以问题是 - 在Android中Selector是否工作或代码应该重写以避免Selector和java.nio一起?
I会给你买一瓶啤酒,我会给你买一盒啤酒!我一直在调试我的android应用一整天,它适用于所有网络,但不适用于我母亲的ISP。关于它,从各方面进行测试,但从来没有我可能认为这可能是IPV6没有被ISP使用。我仍然感到困惑,怎么会这样。无论如何,添加这两行解决了这个问题。消息通过! –