2010-12-11 7 views
2

J'écris un jeu vidéo Android qui supporte le multijoueur. Il y a un serveur dédié sur lequel les androïdes se connectent quand on clique sur le bouton multijoueur en ouvrant un socket (cela fonctionne bien). Le serveur agit essentiellement comme un système de jumelage.Adresse IP Android avec Java

Lorsqu'un client héberge un jeu, le serveur ajoute ce client à la liste des hôtes. D'autres clients peuvent choisir d'afficher cette liste, puis de se connecter ultérieurement à cet hôte. C'est là que se trouve le problème. Le serveur est censé garder une trace de l'adresse IP/port des hôtes, et d'autres clients sont supposés utiliser cette information pour ouvrir une socket avec l'hôte et ensuite le jeu démarre. J'essaye d'obtenir l'hôte pour envoyer sa propre adresse IP au serveur pour d'autres clients à utiliser plus tard.

J'ai essayé beaucoup de méthodes jusqu'ici. L'un est:

try { 
     for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) { 
      NetworkInterface intf = en.nextElement(); 
      for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) { 
       InetAddress inetAddress = enumIpAddr.nextElement(); 
       if (!inetAddress.isLoopbackAddress()) { 
        return inetAddress.getHostAddress().toString(); 
       } 
      } 
     } 
    } catch (SocketException ex) { 
    } 

Ceci renvoie 10.0.2.15, ce qui est évidemment inutile pour d'autres clients.

L'autre méthode que j'ai essayé est ceci:

String hostName = InetAddress.getLocalHost().getHostName(); 
     InetAddress addrs[] = InetAddress.getAllByName(hostName); 
     for (InetAddress addr: addrs) { 
      System.out.println ("addr.getHostAddress() = " + addr.getHostAddress()); 
      System.out.println ("addr.getHostName() = " + addr.getHostName()); 
      System.out.println ("addr.isAnyLocalAddress() = " + addr.isAnyLocalAddress()); 
      System.out.println ("addr.isLinkLocalAddress() = " + addr.isLinkLocalAddress()); 
      System.out.println ("addr.isLoopbackAddress() = " + addr.isLoopbackAddress()); 
      System.out.println ("addr.isMulticastAddress() = " + addr.isMulticastAddress()); 
      System.out.println ("addr.isSiteLocalAddress() = " + addr.isSiteLocalAddress()); 
      System.out.println (""); 

      if (!addr.isLoopbackAddress()){// && addr.isSiteLocalAddress()) { 
       myIP = addr.getHostAddress(); 
      } 

Cette fonction renvoie l'adresse IP que je cherche quand je le lance comme une application java, mais quand je le lance comme une application Android ça ne marche pas. La dernière condition if est en quelque sorte non satisfaite et myIP finit par être nulle. Notez que j'ai inclus les autorisations: android.permission.INTERNET, android.permission.ACCESS_WIFI_STATE, android.permission.ACCESS_COARSE_LOCATION, android.permission.ACCESS_NETWORK_STATE.

Quelqu'un peut-il m'aider?

+0

Avez-vous la même adresse de "ifconfig" dans "adb shell"? Si c'est le cas, votre téléphone peut être derrière un NAT, ce qui signifie que vous ne pouvez pas héberger directement des jeux. –

Répondre

1

Devez-vous vous fier à l'hôte pour trouver sa propre adresse IP et la fournir au serveur? Si l'hôte ouvre une connexion et envoie un message au serveur annonçant qu'il héberge un jeu, le serveur peut-il utiliser l'adresse IP dont provient la connexion et le message? Cela permettrait d'éviter complètement le problème.

0

essayer cette

WifiManager wim= (WifiManager) getSystemService(WIFI_SERVICE) ; 
    List<WifiConfiguration> l= wim.getConfiguredNetworks(); 
    WifiConfiguration wc=l.get(0); 
textview.append( "\n"+ Formatter.formatIpAddress(wim.getConnectionInfo().getIpAddress())); 
9

Si vous avez juste besoin de l'adresse IP pour la connexion Wifi, vous pouvez récupérer l'adresse IP comme un entier de 32 bits:

WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); 
WifiInfo wifiInfo = wifiManager.getConnectionInfo(); 
int ip = wifiInfo.getIpAddress(); 

Ensuite, afin de construire la propriété intellectuelle dans notation point-décimale; bit-shift et masque le résultat:

String ipString = String.format(
"%d.%d.%d.%d", 
(ip & 0xff), 
(ip >> 8 & 0xff), 
(ip >> 16 & 0xff), 
(ip >> 24 & 0xff)); 

permission android.permission.ACCESS_WIFI_STATE sera nécessaire dans le manifeste.

+0

+1 pour bitwise old-school –

+0

Pour tous les noobs, voici une façon plus détaillée de savoir comment fonctionne ce code. : D http://stackoverflow.com/questions/27170602/cannot-understand-how-to-convert-integer-to-ip-in-android-and-java/27170860#27170860 – msmechanized