【问题标题】:Android 2.2 and "Bad address family" on Socket ConnectSocket Connect 上的 Android 2.2 和“错误地址族”
【发布时间】:2010-05-21 03:52:15
【问题描述】:

我有一个相当简单的游戏,现在可以在 2.1 之前的每个版本上完美运行,但是在新的 2.2 (Froyo) 版本中,我无法创建套接字。我正在使用 nio 的 mina 包,并得到这个异常:

W/System.err(263): java.net.SocketException: Bad address family W/System.err(263):在 org.apache.harmony.luni.platform.OSNetworkSystem.connectStreamWithTimeoutSocketImpl(本机方法) W/System.err(263):在 org.apache.harmony.luni.platform.OSNetworkSystem.connect(OSNetworkSystem.java:115) W/System.err(263):在 org.apache.harmony.nio.internal.SocketChannelImpl.connect(SocketChannelImpl.java:272) W/System.err(263):在 org.apache.harmony.nio.internal.PipeImpl$SinkChannelImpl.finishConnect(PipeImpl.java:164) W/System.err(263):在 org.apache.harmony.nio.internal.PipeImpl.(PipeImpl.java:48) W/System.err(263):在 org.apache.harmony.nio.internal.SelectorProviderImpl.openPipe(SelectorProviderImpl.java:51) W/System.err(263):在 org.apache.harmony.nio.internal.SelectorImpl.(SelectorImpl.java:141) W/System.err(263):在 org.apache.harmony.nio.internal.SelectorProviderImpl.openSelector(SelectorProviderImpl.java:58) W/System.err(263):在 java.nio.channels.Selector.open(Selector.java:48) W/System.err(263):在 org.apache.mina.transport.socket.nio.SocketConnector.startupWorker(SocketConnector.java:248) W/System.err(263):在 org.apache.mina.transport.socket.nio.SocketConnector.connect(SocketConnector.java:210) W/System.err(263):在 org.apache.mina.transport.socket.nio.SocketConnector.connect(SocketConnector.java:137) W/System.err(263):在 org.apache.mina.common.support.BaseIoConnector.connect(BaseIoConnector.java:40)

在日志的后面,通常紧随我得到这个:

W/System.err(263): java.lang.NullPointerException W/System.err(263):在 org.apache.harmony.nio.internal.SelectorImpl.wakeup(SelectorImpl.java:418) W/System.err(263):在 org.apache.mina.transport.socket.nio.SocketConnector.connect(SocketConnector.java:222) W/System.err(263):在 org.apache.mina.transport.socket.nio.SocketConnector.connect(SocketConnector.java:137) W/System.err(263):在 org.apache.mina.common.support.BaseIoConnector.connect(BaseIoConnector.java:40)

我已经完成了所有我能想到的谷歌搜索和环顾四周,但一无所获。我最接近的似乎是在 XP 和 Vista 机器上支持 ipv6 的旧 JDK 错误(我正在运行 Vista)。建议包括禁用 ipv6(不起作用)和禁用 ipv4 并离开 ipv6(对我不起作用,因为我的路由器和 ISP 不支持它,因此无法进行测试)。

有什么想法、建议和我没有尝试过的事情吗?

谢谢, 乔什

【问题讨论】:

  • 您能发布您的 Socket 设置代码吗?
  • 嗨 Roman,我正在使用游戏 API,但我应该能够获取代码。有趣的是,不是我正在使用的,但其他人似乎也遇到了同样的问题:smartfoxserver.com/forums/… 我会看看是否能找到设置代码并将其发布在这里。 -- 乔什
  • 快速更新。在尝试在 mina 包中查找导致问题的代码的过程中,我只是决定完全使用不同的堆栈会更容易。在使用标准 java.net.Socket 将其更改为半定制解决方案时 - 现在一切正常。假设这对没有这个选项的人没有帮助,但它对我有用 - 所以继续前进。 -- 乔什

标签: android android-2.2-froyo


【解决方案1】:

感谢乔希... 我可以在上面的链接中得到这个问题的答案

在打开选择器之前使用此代码

==> System.setProperty("java.net.preferIPv6Addresses", "false");

我可以通过问题...

【讨论】:

  • 为我工作。我的环境是在 Ubuntu 10.4 系统上运行的模拟器。
  • 这在真实设备上是一种危险的解决方法。请投票我的答案;-)
【解决方案2】:

这是一个错误并已修复:http://code.google.com/p/android/issues/detail?id=9431

您应该非常小心使用 java.net.preferIPv6Addresses 解决方法,因为有些设备和网络确实需要 IPv6。

(并且,正如原发帖者发现的那样,如果您可以使用 io 而不是 nio,那么您通常应该。)

【讨论】:

  • 鉴于我确实想使用 NIO,您是否知道是否可以检测设备是否支持 IPV6,并且仅在不支持 IPV6 的情况下应用解决方法?或者,等到您遇到异常后再应用解决方法并重试?
【解决方案3】:

是的,你是对的。我将此问题发布到谷歌群组,评论是“模拟器不支持 IPv6”。链接在这里 http://code.google.com/p/android/issues/detail?id=9431

你知道为什么应用程序应该认为它的设备可以支持 iPv6 吗?我认为java应用程序程序员不需要知道这一点。

【讨论】:

    猜你喜欢
    • 2012-12-03
    • 2017-10-21
    • 2017-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-01
    • 2014-07-13
    相关资源
    最近更新 更多