Holen Sie sich die richtige lokale IP-Adresse von java-Applets
Ich würde gerne zur Bestimmung der lokalen IP-Adresse von meinem java-applet. Das problem ist, wenn es mehrere IP-Adressen auf der gleichen Maschine, die hat LAN und internet verbindungen
(palm, VMWare...).
Hier ist mein test :
public static void main(String[] args) {
try {
String hostName = InetAddress.getLocalHost().getHostName();
System.out.println("HostName = " + hostName);
System.out.println("HostAddressLocal = " +
InetAddress.getLocalHost().getHostAddress());
InetAddress[] inetAddresses = InetAddress.getAllByName(hostName);
for (InetAddress inetAddress : inetAddresses) {
System.out.println("hostAddress = " + inetAddress.getHostAddress());
}
} catch (Exception e) {
e.printStackTrace();
}
}
Ist das Ergebnis :
HostName = xxxx
HostAddressLocal = xx.xx.xx.xx
hostAddress = 10.10.11.51
hostAddress = 192.168.23.1
hostAddress = 192.168.106.1
wobei xx.xx.xx.xx ist nicht die richtige Adresse. Die richtige ist 10.10.11.51.
BEARBEITEN in Reaktion auf jarnbjo :
Deine Kristallkugel die Wahrheit sagen. Haben Sie verstehen mein problem. Kann der client die Verbindung über einen proxy, so dass ich nicht verwenden können, Ihren ersten Punkt. Wenn ich diesen code ausführen, werden unten auf meinem computer :
Socket s = new Socket("www.w3c.org", 80);
InetAddress ip = s.getLocalAddress();
System.out.println("Internet IP = " + ip.toString());
s.close();
Habe ich dieses Ergebnis :
Internet IP = /127.0.0.1
Und nicht 10.10.11.51
- Meinst du das applet? Mit einem Haupt-und in der Lage, Zugang zu lokalen UP-Adresse?
- Wir hatten das problem auch.
- Was genau wollen Sie tun? Warum brauchen Sie diese Informationen? Was ist, wenn der Benutzer nicht über eine lokale Adresse? Was ist, wenn der Nutzer hat viele Schnittstellen und viele lokale Adressen? Was ist, wenn der Benutzer von IPv6 (was jede Schnittstelle kann potenziell viele Adressen haben)? Es gibt einige design-problem auf Ihrem Programm, Sie sollten nie verlassen sich auf dieses Merkmal, um korrekt zu arbeiten.
- Gleiche problem hier, danke für den post 😉
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie Sie bereits bemerkt haben, einen computer-können sehr gut mehrere Netzwerkschnittstellen mit unterschiedlichen IP-Adressen und es ist ein wenig schwierig ist, zu erraten, welche Sie als "richtige", da Sie alle eigentlich richtig.
Meine Kristallkugel mir empfehlen, dass du meinst, die IP-Adresse, die der client mit dem server verbinden, von dem das applet geladen wurde. Wenn ja, haben Sie mindestens zwei Möglichkeiten:
Auf dem server, binden Sie das applet auf einer dynamisch generierten HTML-Seite und fügen Sie die IP-Adresse des Clients als applet-parameter. Zumindest, wenn man nichts tut, HTTP-über-proxy, der web-server sollte in der Lage sein, um zu bestimmen, die IP-Adresse des Clients und leitet Sie an das applet.
In dem applet können Sie einen TCP-socket an den Webserver geladen, von der Sie das applet auf und prüfen die lokale Adresse wird für die Verbindung verwendet:
.
Unten von getHostName() C-Funktion gethostbyname(). Sie zunächst auf der Suche in /etc/hosts, dann versuchen zu lösen durch DNS. Also, wenn Sie hinzufügen 10.10.11.51 myhostname in /etc/hosts getHostName() erkennt richtig
In windows gibt es-Analog zu /etc/hosts, ANMUTIGEN in \WINDOWS\System32\Servises oder so...
Dies ist NUR problem bei der Namensauflösung.
In Ihrem code, den Sie zuerst get host name (hostName = InetAddress.getLocalHost().getHostName();)
diese Funktion auf Ihrem computer name setted bei der Installation system installiert wurde.
Dann bekommst du alle IP-Beton-host-Namen (InetAddress.getAllByName(hostName)) - diese Rückkehr alle IP aufgelöst für diesen Hostnamen
Einfaches Beispiel
1 /etc/hosts wie diese
dein code return
2 änderung der /etc/hosts zu schauen, wie
Ihren code zurück
fred-desktop - Namen von meiner ubuntu-box.