2009-06-30 15 views
20

Este código solía devolver mi dirección IP local como 192.xxx.x.xxx pero ahora devuelve 127.0.0.1. Por favor, ayúdame por qué el mismo código devuelve un valor diferente. ¿Hay algo que necesite ver en Linux OS?Dirección IP no obtenida en java

import java.util.*; 
import java.lang.*; 
import java.net.*; 

public class GetOwnIP 
{ 
    public static void main(String args[]) { 
    try{ 
     InetAddress ownIP=InetAddress.getLocalHost(); 
     System.out.println("IP of my system is := "+ownIP.getHostAddress()); 
    }catch (Exception e){ 
     System.out.println("Exception caught ="+e.getMessage()); 
    } 
    } 
} 

Respuesta

30

127.0.0.1 es el adaptador de bucle invertido - es una respuesta perfectamente correcta a la (algo malfomed) pregunta "¿cuál es mi dirección IP?"

El problema es que hay múltiples respuestas correctas a esa pregunta.

EDIT: La documentación para getLocalHost dicen:

Si hay un controlador de seguridad, su método checkConnect se llama con el nombre de host local y -1 como sus argumentos para ver si la operación es permitido. Si la operación no es permitida, se devuelve una dirección InetAddress que representa la dirección de bucle invertido.

¿Es posible que el cambio en el comportamiento se deba a un cambio en los permisos?

EDIT: Creo que NetworkInterface.getNetworkInterfaces es lo que necesita para enumerar todas las posibilidades. He aquí un ejemplo que no muestra direcciones virtuales, pero trabaja para "principales" interfaces:

import java.net.*; 
import java.util.*; 

public class Test 
{ 
    public static void main(String[] args) 
     throws Exception // Just for simplicity 
    { 
     for (Enumeration<NetworkInterface> ifaces = 
       NetworkInterface.getNetworkInterfaces(); 
      ifaces.hasMoreElements();) 
     { 
      NetworkInterface iface = ifaces.nextElement(); 
      System.out.println(iface.getName() + ":"); 
      for (Enumeration<InetAddress> addresses = 
        iface.getInetAddresses(); 
       addresses.hasMoreElements();) 
      { 
       InetAddress address = addresses.nextElement(); 
       System.out.println(" " + address); 
      } 
     } 
    } 
} 

(me había olvidado cuán horrible del tipo Enumeration<T> es trabajar con directamente!)

Aquí están los resultados en mi portátil ahora mismo:

lo: 
    /127.0.0.1 
eth0: 
    /169.254.148.66 
eth1: 
eth2: 
ppp0: 
    /10.54.251.111 

(yo no creo que sea regalar cualquier enormemente información sensible :)

Si sabe qué interfaz de red desea usar, llame al NetworkInterface.getByName(...) y luego mire las direcciones para esa interfaz (como se muestra en el código anterior).

+1

En el ciclo anterior, también puede omitir el bucle de retroceso al marcar NetworkInterface # isLoopback(). – omerkudat

+2

¿Por qué hay una barra antes de la dirección IP? –

+1

@ Matías Es el toString de Java de un objeto InetAddress use address.getHostAddress() para obtener solo los números separados por puntos. –

6

Cuando utiliza InetAddress.getLocalHost() no se garantiza que obtenga una interfaz particular, es decir. podría recibir la interfaz loopback (127) o una conectada.

Para asegurarse de obtener siempre una interfaz externa, debe usar la clase java.net.NetworkInterface. La clase static getByName (String) le dará la interfaz con el nombre definido (como "eth0"). Luego puede usar la función getInetAddresses() para obtener las direcciones IP (podría ser solo una) vinculadas a esa interfaz.

NetworkInterface ni = NetworkInterface.getByName("eth1"); 
ni.getInetAddresses(); 
2

Compruebe su archivo/etc/host. Si coloca 127.0.0.1 primero, devolverá esto como resultado.

La forma correcta de obtener la dirección IP es usar NetworkInterface.getNetworkInterfaces() y ejecutar getInetAddresses() en cada uno de ellos.

-1

Esto es porque usted tiene una línea en/etc/hosts 127.0.0.1 localhost como es necesario tener 192.xxx.xxx.xxx localhost

Aunque tenga en cuenta que esto sería muy malo como para resolver un problema de código, no debe modificar los archivos de configuración de Linux. No solo no es correcto (y corre el riesgo de romper algunas otras aplicaciones de red conscientes en su linux box) sino que tampoco funcionará en ningún otro lado (a menos que los administradores de esos cuadros tengan también la misma mentalidad).

javadoc para InetAddress.getLocalHost(); leer "... se devuelve una dirección InetAddress que representa la dirección de bucle invertido". por lo que parece que la implementación de getLocalHost() es incorrecta en sus cajas de UNIX y WIN. La dirección de loopback es casi siempre 127.0.0.1

"Un host puede tener varias direcciones IP y otros hosts pueden tener que usar direcciones diferentes para alcanzarlo. Por ejemplo, los hosts en la intranet pueden tener que usar 192.168.0.100 , pero las máquinas externas pueden tener que usar 65.123.66.124. Si tiene una conexión de socket a otro host, puede llamar al Socket.getLocalAddress() para averiguar qué dirección local se usa para el socket. "

0

Puede utilizar el método NetworkInterface.getNetworkInterfaces() para recuperar Enumeration de todas las interfaces de red para su sistema.

Para cada uno de los casos NetworkInterface, a continuación, puede utilizar el método getInetAddresses() para recuperar un Enumeration de todos los InetAddress casos relacionados con la interfaz de red.

Finalmente, puede utilizar el método getHostAddress() en cada instancia InetAddress para recuperar la dirección IP en forma de texto.