publica obtener nombre maquina con code cliente java networking network-programming ip-address external

java - obtener - mi ip publica



Obtener la dirección IP ''externa'' en Java (11)

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

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



¿Qué tal esto? Es simple y funcionó lo 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(); } } }


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

El siguiente programa de ejemplo enumera 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"); } }

Lo siguiente es un resultado de muestra 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


Haga una HttpURLConnection a algún sitio como www.whatismyip.com y analice eso :-)


La verdad es que ''no puedes'' en el sentido en que hiciste 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.


No es tan fácil, ya que a una máquina dentro de 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 analizando los resultados html ... ¡no debería ser tan difícil!


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

Sin embargo, puede compilar código que se ejecuta en un sitio web, por ejemplo, en JSP, y luego usar algo que devuelva la dirección IP de donde proviene la solicitud:

request.getRemoteAddr()

O simplemente use los servicios ya existentes que hacen esto, luego analice la respuesta del servicio para descubrir la IP.

Use 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);


Si está utilizando una aplicación web basada en JAVA y si desea obtener la aplicación externa (la que realiza la solicitud a través de un navegador) externa, intente implementar la aplicación en un dominio público y use request.getRemoteAddr () para leer la dirección IP externa.


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

Puede usar el servicio de Amazon 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(); } } } } }



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