2009-10-02 4 views
9

Ich möchte die lokale IP-Adresse von meinem Java-Applet zu bestimmen. Das Problem tritt auf, wenn sich mehrere IP-Adressen auf demselben Rechner befinden, der über LAN- und Internet-Verbindungen verfügt ( (Palm, VMWare ...)).Holen Sie sich die richtige lokale IP-Adresse von Java-Applet

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(); 
     } 
    } 

Das Ergebnis ist:

HostName = xxxx 
    HostAddressLocal = xx.xx.xx.xx 
    hostAddress = 10.10.11.51 
    hostAddress = 192.168.23.1 
    hostAddress = 192.168.106.1 

wo xx.xx.xx.xx nicht die korrekte Adresse ist. Das richtige ist 10.10.11.51.


EDIT als Antwort auf jarnbjo:

Ihre Kristallkugel sagen die Wahrheit. Du hast mein Problem verstanden. Der Client kann eine Verbindung über einen Proxy herstellen, sodass ich Ihren ersten Punkt nicht verwenden kann. Wenn ich diesen Code unten auf meinem Computer ausführen:

Socket s = new Socket("www.w3c.org", 80); 
    InetAddress ip = s.getLocalAddress(); 
    System.out.println("Internet IP = " + ip.toString()); 
    s.close(); 

Ich habe dieses Ergebnis:

Internet IP = /127.0.0.1 

Und nicht 10.10.11.51

+0

Meinst du Applet? Mit einem Haupt- und Zugang zur lokalen UP-Adresse? –

+0

Wir hatten dieses Problem auch. – KLE

+3

Was genau versuchen Sie zu tun? Warum benötigen Sie diese Informationen? Was passiert, wenn der Benutzer keine lokale Adresse hat? Was ist, wenn der Benutzer viele Schnittstellen und viele lokale Adressen hat? Was ist, wenn der Benutzer IPv6 hat (wobei jede Schnittstelle möglicherweise viele Adressen haben kann)? Es gibt ein Designproblem in Ihrem Programm, es sollte sich niemals darauf verlassen, dass dieses Merkmal korrekt funktioniert. – Juliano

Antwort

-1

Im Boden des getHostName() C-Funktion gethostbyname(). Sie suchen zunächst nach/etc/hosts und versuchen dann, über DNS zu beheben. Also, wenn Sie 10.10.11.51 myhostname zu/etc/hosts getHostName() es richtig In Fenstern erkennen sollte es analog zu/etc/hosts, AFAIR in \ WINDOWS \ System32 \ Servises oder so ...

Dies ist NUR das Problem der Namensauflösung.

In Ihrem Code bekommen Sie zuerst den Hostnamen (hostName = InetAddress.getLocalHost(). GetHostName();) Diese Funktion gibt Ihren Computernamen zurück, der bei der Installation des Systems installiert wurde. Dann erhalten Sie alle IP konkreter Hostnamen (InetAddress.getAllByName (hostname)) - diese Rückkehr alle IP für diesen Hostnamen

1/etc/hosts wie folgt

 
127.0.0.1 localhost 
127.0.1.1 fred-desktop 
Einfaches Beispiel behoben

Code Rückkehr

 
HostName = fred-desktop 
HostAddressLocal = 127.0.1.1 
hostAddress = 127.0.1.1 

2 ändern/etc/hosts wie

aussehen
 
127.0.0.1 localhost 
127.0.1.1 fred-desktop 
192.168.1.1 fred-desktop 
20.20.20.20 fred-desktop 

Code kehrt

 
HostName = fred-desktop 
HostAddressLocal = 127.0.1.1 
hostAddress = 127.0.1.1 
hostAddress = 192.168.1.1 
hostAddress = 20.20.20.20 

fred-Desktop - Name meiner Ubuntu-Box.

+0

Das war nicht die Frage. Das Problem ist nicht die Namensauflösung, sondern die Tatsache, dass es mehrere Schnittstellen geben kann. – sleske

+0

Sehr schlecht abstimmen sogar nicht darauf achten, zu beantworten ... –

+0

Die Frage ist für Java und Sie geben einen C-Anruf für einen anderen Zweck – Mark

11

Wie Sie bereits festgestellt haben, kann ein Computer sehr gut mehrere Netzwerkschnittstellen mit verschiedenen IP-Adressen haben und es ist ein wenig schwierig zu erraten, welche Sie als "korrekt" betrachten, da sie alle korrekt sind.

Meine Kristallkugel schlägt mir vor, dass Sie die IP-Adresse meinen, die der Client verwendet, um sich mit dem Server zu verbinden, von dem das Applet geladen wurde. Wenn ja, haben Sie mindestens zwei Möglichkeiten:

  • Auf dem Server können Sie das Applet auf einer dynamisch erzeugten HTML-Seite einbetten und die Client-IP-Adresse als Applet Parameter hinzuzufügen. Zumindest wenn Sie kein HTTP über einen Proxy ausführen, sollte der Webserver in der Lage sein, die IP-Adresse des Clients zu ermitteln und sie an das Applet weiterzugeben.

  • Im Applet können Sie eine TCP-Socket an den Web-Server öffnen, aus dem Sie das Applet geladen und prüfen, ob die Verbindung verwendet, die lokale Adresse wird:

.

Socket s = new Socket("www", 80); 
InetAddress ip = s.getLocalAddress(); 
s.close(); 
+0

Vielen Dank! Siehe meine Bearbeitung in der Frage. – EFalco

+0

Dies funktioniert in der Regel nicht in einem Applet, da die Sicherheitsberechtigungen im standardmäßigen Sandbox-Modus fehlen. Sie müssen dem Applet die [java.net.NetPermission.getNetworkInformation] (http://docs.oracle.com/javase/7/docs/api/java/net/NetPermission.html) in der [Richtliniendatei des Applets zuweisen ] (http://docs.oracle.com/javase/tutorial/security/tour1/step2.html). –

+0

Erstellen einer Steckdose für "www" funktioniert nicht mehr, siehe meine Frage: http://stackoverflow.com/questions/28487579/jsp-new-socket-www-80-stopped-working-after-years-of-working- OK –

Verwandte Themen