J'essaie de développer un système où il y a différents nœuds qui sont exécutés sur un système différent ou sur différents ports du même système.
Maintenant, tous les nœuds créent un socket avec une IP cible comme IP d'un nœud spécial appelé nœud d'amorçage. Les nœuds créent ensuite le leur ServerSocket
et commencent à écouter les connexions.
Le nœud d'amorçage conserve une liste de nœuds et les renvoie lors de l'interrogation.
Maintenant, ce dont j'ai besoin, c'est que le nœud doive enregistrer son IP au nœud d'amorçage. J'ai essayé d'utiliser cli.getInetAddress()
une fois que le client se connecte au ServerSocket
nœud de démarrage mais cela n'a pas fonctionné.
- J'ai besoin que le client enregistre son IP PPP si disponible;
- Sinon, l'IP LAN si disponible;
- Sinon, il doit s'enregistrer 127.0.0.1 en supposant qu'il s'agit du même ordinateur.
En utilisant le code:
System.out.println(Inet4Address.getLocalHost().getHostAddress());
ou
System.out.println(InetAddress.getLocalHost().getHostAddress());
Mon adresse IP de connexion PPP est: 117.204.44.192 mais ce qui précède me renvoie 192.168.1.2
ÉDITER
J'utilise le code suivant:
Enumeration e = NetworkInterface.getNetworkInterfaces();
while(e.hasMoreElements())
{
NetworkInterface n = (NetworkInterface) e.nextElement();
Enumeration ee = n.getInetAddresses();
while (ee.hasMoreElements())
{
InetAddress i = (InetAddress) ee.nextElement();
System.out.println(i.getHostAddress());
}
}
Je peux obtenir toutes les adresses IP associées à tous les NetworkInterface
s, mais comment les distinguer? Voici la sortie que j'obtiens:
127.0.0.1
192.168.1.2
192.168.56.1
117.204.44.19
Réponses:
Cette méthode fonctionne bien lorsqu'il existe plusieurs interfaces réseau. Il renvoie toujours l'IP sortante préférée. Il
8.8.8.8
n'est pas nécessaire que la destination soit accessible.Connect
sur un socket UDP a l'effet suivant: il définit la destination pour Send / Recv, rejette tous les paquets provenant d'autres adresses et - ce que nous utilisons - transfère le socket dans l'état "connecté", définit ses champs appropriés. Cela comprend la vérification de l'existence de l'itinéraire vers la destination en fonction de la table de routage du système et la définition du point de terminaison local en conséquence. La dernière partie ne semble pas être officiellement documentée, mais elle ressemble à un trait intégral de l'API des sockets Berkeley (un effet secondaire de l'état "connecté" UDP) qui fonctionne de manière fiable dans Windows et Linux à travers les versions et les distributions.Ainsi, cette méthode donnera l'adresse locale qui serait utilisée pour se connecter à l'hôte distant spécifié. Il n'y a pas de connexion réelle établie, l'IP distante spécifiée peut donc être inaccessible.
Éditer:
Comme le dit @macomgil , pour MacOS, vous pouvez le faire:
la source
Cela pourrait être un peu délicat dans le cas le plus général.
À première vue,
InetAddress.getLocalHost()
devrait vous donner l'adresse IP de cet hôte. Le problème est qu'un hôte peut avoir de nombreuses interfaces réseau et qu'une interface peut être liée à plusieurs adresses IP. Et pour couronner le tout, toutes les adresses IP ne seront pas accessibles en dehors de votre machine ou de votre réseau local. Par exemple, il peut s'agir d'adresses IP pour des périphériques réseau virtuels, d'adresses IP de réseau privé, etc.Cela signifie que l'adresse IP renvoyée par
InetAddress.getLocalHost()
n'est peut-être pas la bonne à utiliser.Comment pouvez-vous y faire face?
NetworkInterface.getNetworkInterfaces()
pour obtenir toutes les interfaces réseau connues sur l'hôte, puis à parcourir les adresses de chaque NI.InetAddress.getByName()
pour rechercher l'adresse IP principale. (Mais comment l'obtenir et comment gérer un équilibreur de charge basé sur DNS?)En résumé,
InetAddress.getLocalHost()
cela fonctionne généralement, mais vous devrez peut-être fournir une méthode alternative pour les cas où votre code est exécuté dans un environnement avec un réseau "compliqué".En fait, l'API InetAddress fournit des méthodes pour tester les adresses de bouclage, de liaison locale, de site local, de multidiffusion et de diffusion. Vous pouvez les utiliser pour déterminer laquelle des adresses IP que vous récupérez est la plus appropriée.
la source
use getLocalHost().getHostAddress()
publiez quelque chose, vous pouvez le voir0.0.0.0
en regardant depuis un autre ordinateur sur le réseau. Ceci est expliqué ici C'est ce qui m'est arrivé lorsqueLa publication ici a testé le code de contournement d'ambiguïté IP à partir de https://issues.apache.org/jira/browse/JCS-40 (InetAddress.getLocalHost () ambigu sur les systèmes Linux):
la source
Vous pouvez utiliser la classe InetAddress de java à cet effet.
Sortie pour mon système =
IP of my system is := 10.100.98.228
getHostAddress () renvoie
OU vous pouvez aussi faire
Sortie =
IP of my system is := RanRag-PC/10.100.98.228
la source
Lorsque vous recherchez votre adresse "locale", vous devez noter que chaque machine n'a pas seulement une seule interface réseau et que chaque interface peut avoir sa propre adresse locale. Ce qui signifie que votre machine possède toujours plusieurs adresses "locales".
Différentes adresses "locales" seront automatiquement choisies à utiliser lorsque vous vous connectez à différents points de terminaison. Par exemple, lorsque vous vous connectez à
google.com
, vous utilisez une adresse locale "extérieure"; mais lorsque vous vous connectez à votrelocalhost
, votre adresse locale est toujourslocalhost
elle-même, car localhost n'est qu'un bouclage.Vous trouverez ci-dessous comment trouver votre adresse locale lorsque vous communiquez avec
google.com
:la source
Exemple en scala (utile dans le fichier sbt):
la source
EDIT 1: Le code mis à jour, depuis le lien précédent, n'existe plus
VERSION RÉELLE: Cela a cessé de fonctionner
J'espère que cet extrait de code pourrait vous aider à y parvenir:
la source
whatismyip.com
était en panne pendant un certain temps, votre application serait également en panne :(. Ou elle renverra des données inutiles et provoquera un comportement inattendu. En outre, cela renvoie l'outter la plupart des adresses IP détectables parwhatismyip.com
, pas nécessairement l'adresse IP de la machine que vous utilisezimporter d'abord la classe
en classe
la source
Vous pouvez utiliser l'
java.net.InetAddress
API. Essaye ça :la source
la source
Ceci est un exemple de travail de la réponse ACCEPTÉE ci-dessus! Cette classe NetIdentity stockera à la fois l'adresse IP de l'hôte interne et le bouclage local. Si vous êtes sur un serveur basé sur DNS, comme mentionné ci-dessus, vous devrez peut-être ajouter quelques vérifications supplémentaires, ou éventuellement aller sur la route du fichier de configuration.
Lorsque j'exécute ce code, j'obtiens une impression comme celle-ci:
Pour mon utilisation, je configure un serveur Upnp, cela a aidé à comprendre le «modèle» que je cherchais. Certains des objets renvoyés sont des cartes Ethernet, des cartes réseau, des cartes réseau virtuelles, des pilotes et des cartes client VPN. Tout n'a pas non plus d'adresse. Vous voudrez donc sauter les objets d'interface qui ne le font pas.
Vous pouvez également l'ajouter à la boucle du courant
NetworkInterface i
Et vous verrez des informations dans votre sortie un peu comme ceci:
la source
Utilisez InetAddress.getLocalHost () pour obtenir l'adresse locale
la source
la source
Une approche assez simpliste qui semble fonctionner ...
la source
Ceci obtient l'adresse IP de votre réseau si votre machine fait partie d'un réseau
la source
Habituellement, lorsque j'essaie de trouver mon adresse IP publique comme cmyip.com ou www.iplocation.net , j'utilise cette méthode:
la source
Depuis mon système (comme tant d'autres systèmes) avait différentes interfaces réseau.
InetAddress.getLocalHost()
ouInet4Address.getLocalHost()
simplement retourné celui que je ne désirais pas. J'ai donc dû utiliser cette approche naïve.Faites juste attention que dans cette approche, je savais déjà que mon adresse IP souhaitée est dans le
192.168.2
sous-réseau.la source
la source