先決條件: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使用。我仍然感到困惑,怎麼會這樣。無論如何,添加這兩行解決了這個問題。消息通過! –