2010-05-21 8 views
8

J'ai un jeu assez simple qui fonctionne parfaitement sur toutes les versions jusqu'à maintenant 2.1, mais avec la nouvelle version 2.2 (Froyo), je suis incapable de créer un socket. J'utilise le paquet mina pour nio, et obtenir cette exception:Android 2.2 et «Bad adresse famille» sur Socket Connect

W/System.err (263): java.net.SocketException: Adresse Bad famille W/System.err (263): à org.apache.harmony.luni.platform.OSNetworkSystem.connectStreamWithTimeoutSocketImpl (méthode native) 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): at ou g.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): à l'adresse 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): à org.apache.mina.transport.socket.nio.SocketConnector.connect (SocketConnector. Java: 210) W/System.err (263): à org.apache.mina.transport.socket.nio.SocketConnector.connect (SocketCon nector.java:137) W/System.err (263): à org.apache.mina.common.support.BaseIoConnector.connect (BaseIoConnector.java:40)

plus tard dans le journal, généralement immédiatement Je reçois ce qui suit:

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.SocketConnec tor.connect (SocketConnector.java:137) W/System.err (263): à org.apache.mina.common.support.BaseIoConnector.connect (BaseIoConnector.java:40)

je l'ai fait tout le googling et en regardant autour je peux penser et n'ai rien trouvé. Le plus proche que je suis venu semble être un vieux bug JDK avec le support ipv6 sur les machines XP et Vista (je cours Vista). Les recommandations incluaient la désactivation d'ipv6 (qui ne fonctionnait pas) et la désactivation d'ipv4 et la sortie d'ipv6 (cela ne fonctionnera pas pour moi car mon routeur et mon FAI ne le supportent pas et ne peuvent donc pas tester).

Des pensées, des suggestions, des choses que je n'ai pas essayées?

Merci, Josh

+0

peut vous envoyer votre code de configuration Socket? –

+0

Salut Roman, j'utilise une API de jeu, mais je devrais pouvoir obtenir le code. Fait intéressant, pas ce que je suis en utilisant, mais d'autres semblent avoir le même problème: http://www.smartfoxserver.com/forums/viewtopic.php?p=30837&sid=74947ea6a890930771eab7fc36ab41ec Je vais voir si je peux trouvez le code qui définit les choses et affichez-le ici. - Josh – Josh

+0

Une mise à jour rapide. Dans le processus d'essayer de trouver le code causant le problème dans le paquet mina, j'ai juste décidé qu'il serait plus facile d'utiliser une pile différente tout à fait. En le changeant en une solution semi-personnalisée en utilisant des trucs java.net.Socket standard - tout fonctionne bien maintenant. Supposons que cela n'aide pas quelqu'un à rester bloqué sans cette option, mais cela a fonctionné pour moi - donc je continue. - Josh – Josh

Répondre

5

ce fut un bug a été corrigé: http://code.google.com/p/android/issues/detail?id=9431

vous devriez être très prudent avec la solution de contournement de java.net.preferIPv6Addresses, car il existe des dispositifs et des réseaux où vous voulez IPv6.

(et, comme l'affiche originale trouvée, si vous pouvez utiliser io plutôt que nio, vous généralement devrait.)

+0

Étant donné que je veux vraiment utiliser NIO, savez-vous s'il est possible de détecter si le périphérique a le support IPV6 ou non, et n'appliquez la solution de contournement que si aucun support IPV6 n'est possible? Vous pouvez également attendre d'avoir rencontré l'exception, puis appliquer la solution de contournement et réessayer? – RenniePet

0

Oui, vous avez raison. J'ai signalé ce problème à google groups et le commentaire était "l'émulateur ne supporte pas IPv6". Voici le lien http://code.google.com/p/android/issues/detail?id=9431

Savez-vous pourquoi l'application devrait penser que son périphérique peut prendre en charge iPv6 ou non? Je pense que les programmeurs d'applications Java n'ont pas besoin de le savoir.

15

Merci à Josh ... je pourrais obtenir le andswer de ce problème sur le lien ci-dessus

en utilisant ce code avant d'ouvrir un sélecteur

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

je peux passer le problème ...

+0

Fonctionne pour moi aussi. – miracle2k

+0

Fonctionne pour moi. Mon environnement est un émulateur fonctionnant sur le système Ubuntu 10.4. –

+0

c'est une solution de contournement dangereuse sur les appareils réels. Merci de voter _my_ answer ;-) –