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?
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. –