Pregunta Obtener la dirección IP 'externa' en Java


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

73
2018-05-30 15:27


origen


Respuestas:


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

143
2018-05-30 15:30



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

Puedes usar 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();
                }
            }
        }
    }
}

68
2018-01-26 20:41



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.


15
2018-05-30 15:33



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


8
2017-07-30 12:09



¡Todo esto sigue funcionando y funcionando sin problemas! (a partir del 19 de diciembre de 2016)

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!


8
2018-04-04 17:39



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


5
2018-05-30 15:31



http://jstun.javawi.de/ lo hará, siempre que su dispositivo de puerta de enlace lo haga) la mayoría lo hace)


4
2017-09-29 08:02



¿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();
        }
    }
}

4
2017-12-12 15:23



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 obtener el número de IP analizando los resultados html ... ¡no debería ser tan difícil!


1
2018-05-30 15:31



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


0
2017-11-30 22:54



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

0
2018-04-15 10:12