Obtenga la dirección IP local correcta del applet de Java

Me gustaría determinar la dirección IP local de mi applet java. El problema es cuando hay varias direcciones IP en la misma máquina, que tiene conexiones LAN e Internet (palm, VMWare …).

Aquí está mi prueba:

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

El resultado es :

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

donde xx.xx.xx.xx no es la dirección correcta. El correcto es 10.10.11.51.


EDITAR en respuesta a jarnbjo :

Tu bola de cristal dice la verdad. Usted ha entendido mi problema. El cliente puede conectarse a través de un proxy, así que no puedo usar su primer punto. Si ejecuto este código a continuación en mi computadora:

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

Tengo este resultado:

  Internet IP = /127.0.0.1 

Y no 10.10.11.51

Como ya has descubierto, una computadora puede tener varias interfaces de red con diferentes direcciones IP y es un poco difícil adivinar cuál consideras que es “correcta”, ya que todas son correctas.

Mi bola de cristal me sugiere que te refieres a la dirección IP, que el cliente está utilizando para conectarse al servidor, desde donde se cargó el applet. Si es así, tienes al menos dos posibilidades:

  • En el servidor, puede incrustar el applet en una página HTML generada dinámicamente y agregar la dirección IP del cliente como un parámetro de applet. Al menos, si no está haciendo HTTP sobre un proxy, el servidor web debería poder determinar la dirección IP del cliente y pasarla al applet.

  • En el applet, puede abrir un socket TCP al servidor web desde donde cargó el applet y verificar qué dirección local se está utilizando para la conexión:

.

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

En la parte inferior de getHostName () la función C gethostbyname (). Inicialmente buscaban / etc / hosts, luego intentaban resolverlo a través de DNS. Entonces, si agrega 10.10.11.51 myhostname a / etc / hosts getHostName () debería detectarlo correctamente En Windows hay un análogo a / etc / hosts, AFAIR en \ WINDOWS \ System32 \ Servises o más …

Este es SOLO un problema de resolución de nombre.

En su código, primero obtiene el nombre de host (hostName = InetAddress.getLocalHost (). GetHostName ();) esta función devuelve el nombre de su computadora configurado cuando se instaló el sistema de instalación. Luego obtienes todo el IP del nombre de host concreto (InetAddress.getAllByName (hostName)) – esto devuelve todo el IP resuelto para este nombre de host

Ejemplo simple

1 / etc / hosts como este

 127.0.0.1 localhost
 127.0.1.1 fred-desktop

tu código de retorno

 HostName = fred-desktop
 HostAddressLocal = 127.0.1.1
 hostAddress = 127.0.1.1

2 cambiar / etc / hosts para que se vea

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

tu código regresará

 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 – nombre de mi cuadro ubuntu.