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;
}
}
¡Todo esto sigue funcionando y funcionando sin problemas! (a partir del 19 de diciembre de 2016)
- checkip.amazonaws.com
- http://icanhazip.com/
- http://www.trackip.net/ip
- http://myexternalip.com/raw
- http://ipecho.net/plain
-
http://curlmyip.com/(17 de diciembre de 2016) - http://bot.whatismyipaddress.com
Consejo: no dependas solo directamente de uno de ellos; ¡intente usar uno pero tenga un plan de seguridad considerando otros! ¡Cuanto más uses, mejor!
¡Buena suerte!
¿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
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();
}
}
}
}
}
http://jstun.javawi.de/ lo hará, siempre que su dispositivo de puerta de enlace lo haga) la mayoría lo hace)
System.out.println(pageCrawling.getHtmlFromURL("http://ipecho.net/plain"));