Ottieni l’indirizzo IP locale corretto dall’applet java

Vorrei determinare l’indirizzo IP locale dalla mia applet java. Il problema è quando ci sono diversi indirizzi IP sulla stessa macchina, che ha connessioni LAN e Internet (palmare, VMware …).

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

Il risultato è:

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

dove xx.xx.xx.xx non è l’indirizzo corretto. Il corretto è 10.10.11.51.


EDIT in risposta a jarnbjo :

La tua sfera di cristallo dice la verità. Hai capito il mio problema. Il client può connettersi tramite un proxy, quindi non posso usare il tuo primo punto. Se eseguo questo codice qui sotto sul mio computer:

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

Ho questo risultato:

  Internet IP = /127.0.0.1 

E non il 10.10.11.51

Come hai già scoperto, un computer potrebbe benissimo avere diverse interfacce di rete con diversi indirizzi IP ed è un po ‘difficile indovinare quale consideri “corretto”, dato che sono tutti corretti.

La mia sfera di cristallo mi suggerisce che intendi l’indirizzo IP, che il client sta usando per connettersi al server, da cui è stata caricata l’applet. Se è così, hai almeno due possibilità:

  • Sul server, è ansible incorporare l’applet su una pagina HTML generata dynamicmente e aggiungere l’indirizzo IP del client come parametro dell’applet. Almeno se non stai facendo HTTP su un proxy, il server web dovrebbe essere in grado di determinare l’indirizzo IP del client e trasmetterlo all’applet.

  • Nell’applet, è ansible aprire un socket TCP sul server Web dal quale è stata caricata l’applet e controllare quale indirizzo locale viene utilizzato per la connessione:

.

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

In fondo alla funzione getHostName () C gethostbyname (). Inizialmente cercano / etc / hosts, quindi provano a risolverlo tramite DNS. Quindi, se si aggiunge 10.10.11.51 myhostname a / etc / hosts, getHostName () dovrebbe rilevarlo correttamente In windows è analogo a / etc / hosts, AFAIR in \ WINDOWS \ System32 \ Servises o così …

Questo è SOLO un problema di risoluzione dei nomi.

Nel codice si ottiene prima il nome host (hostName = InetAddress.getLocalHost (). GetHostName ();) questa funzione restituisce il nome del computer impostato durante l’installazione del sistema. Quindi si ottiene tutto l’IP del nome host concreto (InetAddress.getAllByName (hostName)) – questo restituisce tutti gli IP risolti per questo nome host

Semplice esempio

1 / etc / hosts come questo

 127.0.0.1 localhost
 127.0.1.1 Fred-Desktop

il tuo codice restituito

 HostName = fred-desktop
 HostAddressLocal = 127.0.1.1
 hostAddress = 127.0.1.1

2 cambia / etc / hosts per assomigliare

 127.0.0.1 localhost
 127.0.1.1 Fred-Desktop
 192.168.1.1 Fred-Desktop
 20.20.20.20 fred-desktop

il tuo codice tornerà

 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 – nome della mia scatola di Ubuntu.