2010-05-30 22 views
68

No estoy muy seguro de cómo obtener la dirección IP externa de la máquina como lo vería una computadora fuera de la red.Obtener la dirección IP 'externa' en Java

Mi siguiente clase IPAddress solo obtiene la dirección IP local de la máquina.

public class IPAddress { 

    private InetAddress thisIp; 

    private String thisIpAddress; 

    private void setIpAdd() { 
     try { 
      InetAddress thisIp = InetAddress.getLocalHost(); 
      thisIpAddress = thisIp.getHostAddress().toString(); 
     } catch (Exception e) { 
     } 
    } 

    protected String getIpAddress() { 
     setIpAdd(); 
     return thisIpAddress; 
    } 
} 
+13

¿Sabe que una máquina puede tener muchas direcciones públicas a la vez? Están realmente asociados a una interfaz de red, no a una máquina. –

Respuesta

130

No estoy seguro si puede obtener esa IP del código que se ejecuta en la máquina local.

Sin embargo, puede crear código que se ejecuta en una página web, por ejemplo en JSP, y luego usar algo que devuelve la IP cuando la solicitud proviene de:

request.getRemoteAddr()

o simplemente utilizar los servicios ya existentes que haga esto, luego analice la respuesta del servicio para descubrir la IP.

utilizar un servicio web como AWS y otros

import java.net.*; 
import java.io.*; 

URL whatismyip = new URL("http://checkip.amazonaws.com"); 
BufferedReader in = new BufferedReader(new InputStreamReader(
       whatismyip.openStream())); 

String ip = in.readLine(); //you get the IP as a String 
System.out.println(ip); 
+4

Palabra de advertencia: han ajustado la URL de automatización a http://automation.whatismyip.com/n09230945.asp – thegrinner

+8

Sugeriría implementar al menos dos servidores que sirvan a su ip, en caso de que uno de ellos esté caído en este momento (con el manejo correcto de errores, por supuesto). Mi elección sería http://www.externalip.net (haga clic en el enlace "¿Necesita una API?"). He estado utilizando ese sitio durante más de un año, no he tenido ningún problema hasta ahora y es un servicio rápido que siempre responde rápidamente. – Felthragar

+0

Enlace impresionante; ¡Utilizaré esto como parte de una prueba de concepto en una asignación de red de la Universidad! – araisbec

5

Hacer un HttpURLConnection a algún sitio como www.whatismyip.com y analizar que :-)

1

No es tan fácil desde el interior de una máquina a una LAN generalmente no le importa la IP externa de su enrutador a internet ... ¡simplemente no la necesita!

Le sugiero que explote esto abriendo un sitio como http://www.whatismyip.com/ y obteniendo el número de IP mediante el análisis de los resultados html ... ¡no debería ser tan difícil!

+2

No es necesario analizar el html. La primera línea de la fuente de la página web de http://whatismyip.com/ es su IP externa. –

15

La verdad es que 'no puedes' en el sentido en que planteaste la pregunta. NAT ocurre fuera del protocolo. No hay forma de que el kernel de su máquina sepa cómo su cuadro NAT está mapeando desde direcciones IP externas a internas. Otras respuestas aquí ofrecen trucos que incluyen métodos para hablar con sitios web externos.

+0

esto debería obtener muchos más votos positivos para simplemente mencionar NAT – Eugene

+1

O no, ya que no responde la pregunta original, y parece un ejercicio académico –

4

http://jstun.javawi.de/ lo hará - a condición de que su dispositivo de puerta de enlace hace STUN) la mayoría lo hacen)

+1

Bastante interesante, funciona como se esperaba sin el uso de servicios externos sino simplemente hablando con el puerta. Sin embargo, la licencia GPL probablemente limitará su adopción. –

+0

El sitio me está dando una pantalla de inicio de sesión. Probablemente no el original. – Jus12

0

Si está utilizando aplicación web basado en JAVA y si quieres tomar del cliente (que hace la solicitud a través de un navegador) IP externa intente implementar la aplicación en un dominio público y use request.getRemoteAddr() para leer la dirección IP externa.

7

Como escribió @Donal Fellows, debe consultar la interfaz de red en lugar de la máquina.Este código de los javadocs trabajó para mí:

El siguiente programa de ejemplo se enumeran todas las interfaces de red y sus direcciones en una máquina:

import java.io.*; 
import java.net.*; 
import java.util.*; 
import static java.lang.System.out; 

public class ListNets { 

    public static void main(String args[]) throws SocketException { 
     Enumeration<NetworkInterface> nets = NetworkInterface.getNetworkInterfaces(); 
     for (NetworkInterface netint : Collections.list(nets)) 
      displayInterfaceInformation(netint); 
    } 

    static void displayInterfaceInformation(NetworkInterface netint) throws SocketException { 
     out.printf("Display name: %s\n", netint.getDisplayName()); 
     out.printf("Name: %s\n", netint.getName()); 
     Enumeration<InetAddress> inetAddresses = netint.getInetAddresses(); 
     for (InetAddress inetAddress : Collections.list(inetAddresses)) { 
      out.printf("InetAddress: %s\n", inetAddress); 
     } 
     out.printf("\n"); 
    } 
} 

El siguiente es un ejemplo de salida del programa de ejemplo:

Display name: TCP Loopback interface 
Name: lo 
InetAddress: /127.0.0.1 

Display name: Wireless Network Connection 
Name: eth0 
InetAddress: /192.0.2.0 

de docs.oracle.com

+1

¡Gracias! Si bien esta solución no funcionará cuando el software está detrás de un NAT, sigue siendo muy útil para el software de servidor que usted sabe que no estará detrás de un NAT, o como una alternativa si el software no se puede conectar a otro servidor para obtener su propio IP. En particular, para el software destinado a ejecutarse en LAN desconectados de Internet, es el camino a seguir. – pavon

65

Uno de los comentarios de @stivlo merece ser una respuesta:

Puede utilizar el servicio de Amazon http://checkip.amazonaws.com

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.URL; 

public class IpChecker { 

    public static String getIp() throws Exception { 
     URL whatismyip = new URL("http://checkip.amazonaws.com"); 
     BufferedReader in = null; 
     try { 
      in = new BufferedReader(new InputStreamReader(
        whatismyip.openStream())); 
      String ip = in.readLine(); 
      return ip; 
     } finally { 
      if (in != null) { 
       try { 
        in.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 
} 
+1

buena respuesta, esto me ayudó gracias –

7

Todo esto todavía están en marcha y funcionando sin problemas! (al 19 Dec 2016)

Consejo: no depende directamente de uno de ellos; ¡intente usar uno pero tenga un plan de continuidad considerando otros! ¡Cuanto más uses, mejor!

¡Buena suerte!

+1

Curlmyip ya no funciona. – Jus12

0
System.out.println(pageCrawling.getHtmlFromURL("http://ipecho.net/plain")); 
3

¿Qué le parece esto? Es simple y funcionó mejor para mí :)

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.MalformedURLException; 
import java.net.URL; 


public class IP { 
    public static void main(String args[]) { 
     new IP(); 
    } 

    public IP() { 
     URL ipAdress; 

     try { 
      ipAdress = new URL("http://myexternalip.com/raw"); 

      BufferedReader in = new BufferedReader(new InputStreamReader(ipAdress.openStream())); 

      String ip = in.readLine(); 
      System.out.println(ip); 
     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+0

¡Esto es excelente! Lo intentaré cuando llegue a casa. Este es exactamente el tipo de solución de problemas que estaba buscando. No sé por qué no ha sido votado más alto. – Adam893

Cuestiones relacionadas