2009-10-02 20 views
9

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 ...).Obtenga la dirección IP local correcta del applet de java

Aquí es 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:

Su 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 ejecuta este código de abajo en mi equipo:

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

+0

¿Quieres decir applet? Con un principal y capaz de acceder a la dirección UP local? –

+0

Tuvimos ese problema también. – KLE

+3

¿Qué estás tratando de hacer exactamente? ¿Por qué necesita esta información? ¿Qué pasa si el usuario no tiene una dirección local? ¿Qué sucede si el usuario tiene muchas interfaces y muchas direcciones locales? ¿Qué pasa si el usuario tiene IPv6 (que cada interfaz puede tener muchas direcciones)? Hay un problema de diseño en su programa, nunca debe confiar en que esta característica funcione correctamente. – Juliano

Respuesta

-1

En parte inferior de getHostName() función C gethostbyname(). Inicialmente buscaban/etc/hosts, luego intentaban resolverlo a través de DNS. Por lo tanto, si se agrega 10.10.11.51 myhostname a/etc/hosts getHostName() debe detectar correctamente En las ventanas no es análogo a/etc/hosts, AFAIR en \ Windows \ System32 \ Catálogo de servicios más o menos ...

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

En su código, primero aparece el nombre de host (hostName = InetAddress.getLocalHost(). GetHostName();) esta función devuelve el nombre de su equipo configurado al instalar el sistema. Entonces usted consigue todos los IP del nombre de host concreto (InetAddress.getAllByName (hostname)) - este regreso todos los IP resuelta por este nombre de host

ejemplo simple

1/etc/hosts como este

 
127.0.0.1 localhost 
127.0.1.1 fred-desktop 

su declaración de código

 
HostName = fred-desktop 
HostAddressLocal = 127.0.1.1 
hostAddress = 127.0.1.1 

2 cambie/etc/hosts para que parezca

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

su código volverá

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

Fred-escritorio - nombre de mi caja de ubuntu.

+0

Esa no era la pregunta. El problema no es la resolución del nombre, sino el hecho de que puede haber múltiples interfaces. – sleske

+0

Muy mala votación incluso sin prestar atención a la respuesta ... –

+0

La pregunta es para Java y usted da una llamada C para un propósito diferente – Mark

11

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 quiere decir la dirección IP, que el cliente está utilizando para conectarse al servidor, desde donde se cargó el applet. Si es así, usted tiene al menos dos posibilidades:

  • En el servidor, puede incrustar el applet en una página HTML generado dinámicamente y añadir la dirección IP del cliente como un parámetro del 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 el cual cargó el applet y comprobar qué dirección local se utiliza para la conexión:

.

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

¡Muchas gracias! Ver mi edición en la pregunta. – EFalco

+0

Por lo general, esto no funcionará en un applet en estos días debido a la falta de permisos de seguridad en el modo de espacio aislado predeterminado. Deberá otorgarle al applet [java.net.NetPermission.getNetworkInformation] (http://docs.oracle.com/javase/7/docs/api/java/net/NetPermission.html) en el archivo de política del applet. ] (http://docs.oracle.com/javase/tutorial/security/tour1/step2.html). –

+0

creando un socket para "www" dejó de funcionar, por favor vea mi pregunta: http://stackoverflow.com/questions/28487579/jsp-new-socket-www-80-stopped-working-after-years-of-working- De acuerdo –

Cuestiones relacionadas