2010-03-04 14 views
41

Escribo una aplicación de red simple ... Necesito saber la ip real de mi máquina en la red, como 192.168.1.3. getLocalHost devuelve 127.0.0.1 (en Linux, no sé si es lo mismo en Windows) cómo hacerlo ?;java InetAddress.getLocalHost(); devuelve 127.0.0.1 ... cómo obtener IP REAL?

+0

En mis ventanas, System.out.println (InetAddress.getLocalHost() getHostAddress().); imprime 10.50.16.136 –

+0

127.0.1.1 para mí (Ubuntu) – sfussenegger

+0

Interesante ... ¿respuesta correcta aunque no está funcionando? – sfussenegger

Respuesta

3

Su computadora puede tener múltiples direcciones IP. ¿Cómo sabes cuál? La forma en que lo hago es tener un CGI muy simple ejecutándose en otra máquina que informa de la IP que ha visto, y lo llamo cuando necesito saber cómo se ve mi IP en el mundo exterior.

21

Como la máquina puede tener varias direcciones, es difícil determinar cuál es la adecuada para usted. Normalmente, desea que el sistema asigne una IP en función de su tabla de enrutamiento. A medida que el resultado depende de la IP desea conectarse, hay un truco muy simple: basta con crear una conexión y ver cuál es la dirección que tienes desde el sistema operativo:

// output on my machine: "192.168.1.102" 
Socket s = new Socket("192.168.1.1", 80); 
System.out.println(s.getLocalAddress().getHostAddress()); 
s.close(); 

// output on my machine: "127.0.1.1" 
System.out.println(InetAddress.getLocalHost().getHostAddress()); 

No estoy seguro de si sin embargo, es posible hacer esto sin establecer una conexión. Creo que una vez logré hacerlo con Perl (o C?), Pero no me pregunten sobre Java. Creo que podría ser posible crear un socket UDP (DatagramSocket) sin conectarlo realmente.

Si hay un enrutador NAT en camino, no podrá obtener la IP que verán los hosts remotos. Sin embargo, como dio 192. * como ejemplo, creo que no le importa.

28

Si realmente desea trabajar con todas las direcciones IP de la máquina, puede obtenerlas con la clase NetworkInterface. Por supuesto, necesitas cuál quieres usar realmente, pero eso va a ser diferente dependiendo de para qué lo estés usando, o podrías necesitar expandir la forma en que lo estás usando para contabilizar varias direcciones.

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

public class ShowInterfaces 
{ 
     public static void main(String[] args) throws Exception 
     { 
       System.out.println("Host addr: " + InetAddress.getLocalHost().getHostAddress()); // often returns "127.0.0.1" 
       Enumeration<NetworkInterface> n = NetworkInterface.getNetworkInterfaces(); 
       for (; n.hasMoreElements();) 
       { 
         NetworkInterface e = n.nextElement(); 
         System.out.println("Interface: " + e.getName()); 
         Enumeration<InetAddress> a = e.getInetAddresses(); 
         for (; a.hasMoreElements();) 
         { 
           InetAddress addr = a.nextElement(); 
           System.out.println(" " + addr.getHostAddress()); 
         } 
       } 
     } 
} 
+15

'while (x.hasMoreElements()) {}' sería más nítido que 'for (; x.hasMoreElements();) {}' – sync

17

Para solucionarlo:

  1. encontrar el nombre de host. Tipo: hostname. Por ejemplo, puede encontrar que su nombre de host es mycomputer.xzy.com

  2. Ponga su nombre de host en su archivo de hosts. /etc/hosts. Tal como

    10.50.16.136 mycomputer.xzy.com 
    
8

Aquí es una manera de evitar IPv6 y de bucle resultados.

public InetAddress getCurrentIp() { 
      try { 
       Enumeration<NetworkInterface> networkInterfaces = NetworkInterface 
         .getNetworkInterfaces(); 
       while (networkInterfaces.hasMoreElements()) { 
        NetworkInterface ni = (NetworkInterface) networkInterfaces 
          .nextElement(); 
        Enumeration<InetAddress> nias = ni.getInetAddresses(); 
        while(nias.hasMoreElements()) { 
         InetAddress ia= (InetAddress) nias.nextElement(); 
         if (!ia.isLinkLocalAddress() 
         && !ia.isLoopbackAddress() 
         && ia instanceof Inet4Address) { 
          return ia; 
         } 
        } 
       } 
      } catch (SocketException e) { 
       LOG.error("unable to get current IP " + e.getMessage(), e); 
      } 
      return null; 
     } 
1

Consigue la solicitud actual de la instancia actual

HttpServletRequest httpServletRequest = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest(); 

a continuación, obtener la dirección de la solicitud

ip = httpServletRequest.getRemoteAddr(); 
+1

¡Incluir un breve comentario sobre el código/solución haría que esta respuesta fuera completa! –

+0

Esta respuesta se siente como la correcta. Estoy buscando la dirección de solicitud del cliente en una solicitud smpp a mi servidor – PhillipMwaniki

-4

En caso de que desee obtener la dirección IP de su ordenador, tiene que usar el objeto "InetAddress", que existe en la biblioteca "java.net.InetAddress".

El método siguiente devuelve su IP:

public String getIp() { 

    String myIp = ""; 
    InetAddress ip; 

    try { 
     ip = InetAddress.getLocalHost(); 
     myIp = ip.getHostAddress();  // This method returns the IP. 
    } catch (UnknownHostException e) { 
     e.printStackTrace(); 
    } 

    return myIp; 
} 
2

En lugar de utilizar InetAddress.getHostAddress(), que llama a la rutina getHost4Address que escribí para obtener la primera dirección sin bucle de retorno ...

/** 
* Returns this host's non-loopback IPv4 addresses. 
* 
* @return 
* @throws SocketException 
*/ 
private static List<Inet4Address> getInet4Addresses() throws SocketException { 
    List<Inet4Address> ret = new ArrayList<Inet4Address>(); 

    Enumeration<NetworkInterface> nets = NetworkInterface.getNetworkInterfaces(); 
    for (NetworkInterface netint : Collections.list(nets)) { 
     Enumeration<InetAddress> inetAddresses = netint.getInetAddresses(); 
     for (InetAddress inetAddress : Collections.list(inetAddresses)) { 
      if (inetAddress instanceof Inet4Address && !inetAddress.isLoopbackAddress()) { 
       ret.add((Inet4Address)inetAddress); 
      } 
     } 
    } 

    return ret; 
} 

/** 
* Returns this host's first non-loopback IPv4 address string in textual 
* representation. 
* 
* @return 
* @throws SocketException 
*/ 
private static String getHost4Address() throws SocketException { 
    List<Inet4Address> inet4 = getInet4Addresses(); 
    return !inet4.isEmpty() 
      ? inet4.get(0).getHostAddress() 
      : null; 
} 
2

de escribir este código:

import java.net.InterfaceAddress; 
import java.net.NetworkInterface; 
import java.util.Collections; 
import java.util.HashSet; 
import java.util.Set; 


private String[] getHostAddresses() { 
    Set<String> HostAddresses = new HashSet<>(); 
    try { 
    for (NetworkInterface ni : Collections.list(NetworkInterface.getNetworkInterfaces())) { 
     if (!ni.isLoopback() && ni.isUp() && ni.getHardwareAddress() != null) { 
     for (InterfaceAddress ia : ni.getInterfaceAddresses()) { 
      if (ia.getBroadcast() != null) { //If limited to IPV4 
      HostAddresses.add(ia.getAddress().getHostAddress()); 
      } 
     } 
     } 
    } 
    } catch (SocketException e) { } 
    return HostAddresses.toArray(new String[0]); 
} 

Compruébalo!

Para mí:

  • no debe ser de bucle de retorno!
  • Debe estar ARRIBA!
  • Debe tener la dirección MAC (no es nulo)
Cuestiones relacionadas