Ich versuche, ein System zu entwickeln, in dem verschiedene Knoten auf verschiedenen Systemen oder an verschiedenen Ports auf demselben System ausgeführt werden.
Jetzt erstellen alle Knoten einen Socket mit einer Ziel-IP als IP eines speziellen Knotens, der als Bootstrapping-Knoten bezeichnet wird. Die Knoten erstellen dann ihre eigenen ServerSocket
und warten auf Verbindungen.
Der Bootstrapping-Knoten verwaltet eine Liste von Knoten und gibt diese bei Abfrage zurück.
Was ich jetzt brauche, ist, dass der Knoten seine IP beim Bootstrapping-Knoten registrieren muss. Ich habe versucht, zu verwenden, cli.getInetAddress()
sobald der Client eine Verbindung zum ServerSocket
Bootstrapping-Knoten hergestellt hat, aber das hat nicht funktioniert.
- Ich benötige den Client, um seine PPP-IP zu registrieren, falls verfügbar.
- Andernfalls die LAN-IP, falls verfügbar;
- Andernfalls muss 127.0.0.1 unter der Annahme registriert werden, dass es sich um denselben Computer handelt.
Verwenden des Codes:
System.out.println(Inet4Address.getLocalHost().getHostAddress());
oder
System.out.println(InetAddress.getLocalHost().getHostAddress());
Meine PPP-Verbindungs-IP-Adresse lautet: 117.204.44.192, aber die oben angegebene Adresse gibt mir 192.168.1.2 zurück
BEARBEITEN
Ich verwende den folgenden Code:
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());
}
}
Ich kann alle IP-Adressen abrufen, die allen NetworkInterface
s zugeordnet sind, aber wie unterscheide ich sie? Dies ist die Ausgabe, die ich bekomme:
127.0.0.1
192.168.1.2
192.168.56.1
117.204.44.19
Antworten:
Diese Methode funktioniert gut, wenn mehrere Netzwerkschnittstellen vorhanden sind. Es wird immer die bevorzugte ausgehende IP zurückgegeben. Das Ziel muss
8.8.8.8
nicht erreichbar sein.Connect
Ein UDP-Socket hat folgenden Effekt: Er legt das Ziel für Senden / Empfangen fest, verwirft alle Pakete von anderen Adressen und versetzt den Socket - was wir verwenden - in den Status "Verbunden" und stellt die entsprechenden Felder ein. Dies umfasst das Überprüfen des Vorhandenseins der Route zum Ziel gemäß der Routing-Tabelle des Systems und das entsprechende Festlegen des lokalen Endpunkts. Der letzte Teil scheint offiziell nicht dokumentiert zu sein, sieht jedoch wie ein integraler Bestandteil der Berkeley-Sockets-API aus (ein Nebeneffekt des "verbundenen" UDP-Status), der sowohl unter Windows als auch unter Linux über Versionen und Distributionen hinweg zuverlässig funktioniert.Diese Methode gibt also die lokale Adresse an, die für die Verbindung mit dem angegebenen Remote-Host verwendet wird. Es wurde keine echte Verbindung hergestellt, daher kann die angegebene Remote-IP nicht erreichbar sein.
Bearbeiten:
Wie @macomgil sagt, können Sie dies unter MacOS wie folgt tun:
quelle
Dies kann im allgemeinsten Fall etwas schwierig sein.
Auf den ersten Blick
InetAddress.getLocalHost()
sollte Ihnen die IP-Adresse dieses Hosts geben. Das Problem ist, dass ein Host viele Netzwerkschnittstellen haben kann und eine Schnittstelle an mehr als eine IP-Adresse gebunden sein kann. Darüber hinaus sind nicht alle IP-Adressen außerhalb Ihres Computers oder Ihres LAN erreichbar. Dies können beispielsweise IP-Adressen für virtuelle Netzwerkgeräte, private Netzwerk-IP-Adressen usw. sein.Dies bedeutet, dass die von zurückgegebene IP-Adresse
InetAddress.getLocalHost()
möglicherweise nicht die richtige ist.Wie können Sie damit umgehen?
NetworkInterface.getNetworkInterfaces()
, alle bekannten Netzwerkschnittstellen auf dem Host abzurufen und dann die Adressen der einzelnen NI zu durchlaufen.InetAddress.getByName()
die primäre IP-Adresse nachzuschlagen . (Aber wie bekommen Sie es und wie gehen Sie mit einem DNS-basierten Load Balancer um?)Zusammenfassend
InetAddress.getLocalHost()
funktioniert dies normalerweise, aber Sie müssen möglicherweise eine alternative Methode für die Fälle bereitstellen, in denen Ihr Code in einer Umgebung mit "kompliziertem" Netzwerk ausgeführt wird.Tatsächlich bietet die InetAddress-API Methoden zum Testen von Loopback-, Link Local-, Site Local-, Multicast- und Broadcast-Adressen. Sie können diese verwenden, um herauszufinden, welche der IP-Adressen, die Sie zurückerhalten, am besten geeignet ist.
quelle
use getLocalHost().getHostAddress()
etwas veröffentlichen0.0.0.0
möchten , möglicherweise sehen , wenn Sie von einem anderen Computer im Netzwerk aus suchen. Dies wird hier erklärt. Dies ist mir passiert, als ich Gazebo auf zwei Computern verwendet habeWenn Sie hier getesteten IP-Ambiguitäts-Workaround-Code von https://issues.apache.org/jira/browse/JCS-40 (InetAddress.getLocalHost () auf Linux-Systemen nicht eindeutig) veröffentlichen:
quelle
Zu diesem Zweck können Sie die InetAddress- Klasse von Java verwenden.
Ausgabe für mein System =
IP of my system is := 10.100.98.228
getHostAddress () gibt zurück
ODER Sie können auch tun
Ausgabe =
IP of my system is := RanRag-PC/10.100.98.228
quelle
Wenn Sie nach Ihrer "lokalen" Adresse suchen, sollten Sie beachten, dass jeder Computer nicht nur eine einzige Netzwerkschnittstelle hat und jede Schnittstelle möglicherweise eine eigene lokale Adresse hat. Dies bedeutet, dass Ihr Computer immer mehrere "lokale" Adressen besitzt.
Verschiedene "lokale" Adressen werden automatisch ausgewählt, wenn Sie eine Verbindung zu verschiedenen Endpunkten herstellen. Wenn Sie beispielsweise eine Verbindung herstellen
google.com
, verwenden Sie eine lokale Adresse "außerhalb". Wenn Sie jedoch eine Verbindung zu Ihrem herstellenlocalhost
, ist Ihre lokale Adresse immerlocalhost
selbst, da localhost nur ein Loopback ist.Im Folgenden erfahren Sie, wie Sie Ihre lokale Adresse ermitteln, wenn Sie mit
google.com
folgenden Personen kommunizieren :quelle
Beispiel in Scala (nützlich in der Sbt-Datei):
quelle
BEARBEITEN 1: Der aktualisierte Code ist seit dem vorherigen Link nicht mehr vorhanden
TATSÄCHLICHE VERSION: Dies funktioniert nicht mehr
Hoffentlich kann Ihnen dieses Snippet dabei helfen:
quelle
whatismyip.com
längere Zeit nicht verfügbar waren, wäre Ihre App ebenfalls nicht verfügbar :(. Oder sie gibt Mülldaten zurück und verursacht unerwartetes Verhalten. Außerdem gibt dies den Outter zurück Die meisten IP-Adressen sind erkennbar anwhatismyip.com
, nicht unbedingt an der IP-Adresse des von Ihnen verwendeten Computers.Importieren Sie zuerst die Klasse
im Unterricht
quelle
Sie können
java.net.InetAddress
API verwenden. Versuche dies :quelle
quelle
Dies ist ein funktionierendes Beispiel für die oben akzeptierte Antwort! Diese NetIdentity-Klasse speichert sowohl die interne Host-IP als auch den lokalen Loopback. Wenn Sie sich wie oben erwähnt auf einem DNS-basierten Server befinden, müssen Sie möglicherweise weitere Überprüfungen hinzufügen oder möglicherweise die Route der Konfigurationsdatei wählen.
Wenn ich diesen Code ausführe, erhalte ich tatsächlich einen Ausdruck wie folgt:
Für meine Verwendung richte ich einen Upnp-Server ein. Es half mir, das gesuchte 'Muster' zu verstehen. Einige der zurückgegebenen Objekte sind Ethernet-Adapter, Netzwerkadapter, virtuelle Netzwerkadapter, Treiber und VPN-Clientadapter. Auch hat nicht alles eine Adresse. Sie sollten also auf Schnittstellenobjekte verzichten, die dies nicht tun.
Sie können dies auch zur Schleife für den Strom hinzufügen
NetworkInterface i
Und Sie werden Informationen in Ihrer Ausgabe ähnlich sehen:
quelle
Verwenden Sie InetAddress.getLocalHost () , um die lokale Adresse abzurufen
quelle
quelle
Ein eher simpler Ansatz, der zu funktionieren scheint ...
quelle
Dadurch wird die IP-Adresse Ihres Netzwerks abgerufen, wenn Ihr Computer Teil eines Netzwerks ist
quelle
Wenn ich versuche, meine öffentliche IP-Adresse wie cmyip.com oder www.iplocation.net zu finden , gehe ich normalerweise folgendermaßen vor :
quelle
Da mein System (wie so viele andere Systeme) verschiedene Netzwerkschnittstellen hatte.
InetAddress.getLocalHost()
oderInet4Address.getLocalHost()
einfach eine zurückgegeben, die ich nicht wollte. Deshalb musste ich diesen naiven Ansatz verwenden.Seien Sie nur vorsichtig, dass ich bei diesem Ansatz bereits wusste, dass sich meine gewünschte IP-Adresse im
192.168.2
Subnetz befindet.quelle
quelle