2010-05-21 5 views
8

Ich habe ein ziemlich einfaches Spiel, das perfekt auf jeder Version bis 2.1 funktioniert, aber mit der neuen Version 2.2 (Froyo) kann ich keinen Socket erstellen. Ich bin das mina-Paket für nio verwenden und bekommen diese Ausnahme:Android 2.2 und "Bad address family" auf Socket Connect

W/System.err (263): java.net.SocketException: Bad Adresse Familie W/System.err (263): at org.apache.harmony.luni.platform.OSNetworkSystem.connectStreamWithTimeoutSocketImpl (systemeigene Methode) W/System.err (263): at org.apache.harmony.luni.platform.OSNetworkSystem.connect (OSNetworkSystem.java:115) W/System.err (263): at org.apache.harmony.nio.internal.SocketChannelImpl.connect (SocketChannelImpl.java:272) W/System.err (263): at org.apache.harmony.nio.internal .PipeImpl $ SinkChannelImpl.finishConnect (PipeImpl.java:164) W/System.err (263): at oder g.apache.harmony.nio.internal.PipeImpl. (PipeImpl.java:48) W/System.err (263): at org.apache.harmony.nio.internal.SelectorProviderImpl.openPipe (SelectorProviderImpl.java:51) W/System.err (263): at org.apache.harmony.nio.internal.SelectorImpl. (SelectorImpl.java:141) W/System.err (263): at org.apache.harmony.nio.internal .SelectorProviderImpl.openSelector (SelectorProviderImpl.java:58) W/System.err (263): bei java.nio.channels.Selector.open (Selector.java:48) W/System.err (263): at org .apache.mina.transport.socket.nio.SocketConnector.startupWorker (SocketConnector.java:248) W/System.err (263): at org.apache.mina.transport.socket.nio.SocketConnector.connect (SocketConnector. Java: 210) W/System.err (263): bei org.apache.mina.transport.socket.nio.SocketConnector.connect (SocketCon nector.java:137) W/System.err (263): bei org.apache.mina.common.support.BaseIoConnector.connect (BaseIoConnector.java:40)

später im Protokoll, in der Regel sofort folgende ich diese:

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

ich getan habe all das Googeln und Umschauen kann ich mir denken und nichts finden. Der nächste, den ich je gesehen habe, scheint ein alter JDK-Bug mit ipv6-Unterstützung auf XP- und Vista-Rechnern zu sein (ich betreibe Vista). Die Empfehlungen beinhalteten das Deaktivieren von ipv6 (das nicht funktionierte) und das Deaktivieren von ipv4 und das Verlassen von ipv6 (funktioniert nicht für mich, da mein Router und ISP es nicht unterstützen und deshalb sowieso nicht testen konnten).

Irgendwelche Gedanken, Vorschläge, Dinge, die ich nicht versucht habe?

Danke, Josh

+0

können Sie Ihre Socket-Setup-Code posten? –

+0

Hallo Roman, Ich benutze eine Gaming-API, aber ich sollte in der Lage sein, den Code zu bekommen. Interessanterweise nicht, was ich bin mit, aber andere scheinen das gleiche Problem zu haben: http://www.smartfoxserver.com/forums/viewtopic.php?p=30837&sid=74947ea6a890930771eab7fc36ab41ec Ich sehe werde, wenn ich kann finde den Code, der die Dinge regelt und poste ihn hier. - Josh – Josh

+0

Ein kurzes Update. Bei dem Versuch, den Code zu finden, der das Problem im mina-Paket verursacht, habe ich einfach entschieden, dass es einfacher ist, einen anderen Stack zu verwenden. Indem wir es auf eine semi-benutzerdefinierte Lösung umstellen, die standardmäßige java.net.Socket-Sachen verwendet - alles funktioniert jetzt gut. Angenommen, dies würde jemandem helfen, der ohne diese Option festsitzt, aber es hat für mich funktioniert - also weiter. - Josh – Josh

Antwort

5

dies war ein Fehler und wurde behoben: http://code.google.com/p/android/issues/detail?id=9431

Sie sollten mit dem java.net.preferIPv6Addresses Abhilfe sehr vorsichtig sein, denn es gibt Geräte und Netzwerke wo du IPv6 willst.

(und, wie das ursprüngliche Plakat gefunden, wenn Sie können io verwenden, anstatt nio, Sie in der Regel sollte.)

+0

Vorausgesetzt, dass ich wirklich NIO verwenden möchte, weißt du, ob es möglich ist zu erkennen, ob das Gerät IPV6-Unterstützung hat oder nicht, und nur die Problemumgehung anwenden, wenn keine IPV6-Unterstützung möglich ist? Warten Sie alternativ, bis die Ausnahme aufgetreten ist, und wenden Sie die Problemumgehung an und versuchen Sie es erneut. – RenniePet

0

Ja, Sie haben Recht. Ich postete dieses Problem in Google Groups und der Kommentar lautete: "Der Emulator unterstützt IPv6 nicht". Hier ist der Link http://code.google.com/p/android/issues/detail?id=9431

Wissen Sie, warum Anwendung sollte glauben, es ist Gerät kann iPv6 oder nicht unterstützen? Ich denke, dass Java-Anwendungsprogrammierer das nicht wissen müssen.

15

Dank Josh ... Ich kann den andswer für dieses Problem bei dem obigen Link

mit diesem Code erhalten, bevor einem Selektor

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

ich das Problem passieren kann ...

+0

Funktioniert auch für mich. – miracle2k

+0

Funktioniert für mich. Meine Umgebung ist Emulator läuft auf Ubuntu 10.4 System. –

+0

Dies ist eine gefährliche Problemumgehung auf echten Geräten. bitte stimme ab _meine_ antwort ;-) –