Ottenere l’indirizzo IP “esterno” in Java

Non sono sicuro di come ottenere l’indirizzo IP esterno della macchina come un computer esterno a una rete.

La mia class IPAddress seguente ottiene solo l’indirizzo IP locale della macchina.

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

Non sono sicuro che tu possa prendere quell’IP dal codice che gira sul computer locale.

È comunque ansible creare codice che viene eseguito su un sito Web, ad esempio in JSP, e quindi utilizzare qualcosa che restituisce l’IP di provenienza della richiesta:

request.getRemoteAddr()

O semplicemente usa i servizi già esistenti che fanno questo, quindi analizza la risposta dal servizio per scoprire l’IP.

Usa un servizio web come AWS e altri

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

Uno dei commenti di @stivlo merita di essere una risposta:

Puoi utilizzare il servizio 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(); } } } } } 

La verità è “non puoi” nel senso che hai posto la domanda. NAT si verifica al di fuori del protocollo. Non c’è modo per il kernel della tua macchina di sapere come la tua NAT box sta mappando da esterni a destinatari IP interni. Altre risposte qui offrono trucchi che implicano metodi per parlare con siti Web esterni.

Come ha scritto @Donal Fellows, devi interrogare l’interfaccia di rete invece della macchina. Questo codice da javadocs ha funzionato per me:

Il seguente programma di esempio elenca tutte le interfacce di rete e i relativi indirizzi su una macchina:

 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 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 inetAddresses = netint.getInetAddresses(); for (InetAddress inetAddress : Collections.list(inetAddresses)) { out.printf("InetAddress: %s\n", inetAddress); } out.printf("\n"); } } 

Quanto segue è un esempio di output del programma di esempio:

 Display name: TCP Loopback interface Name: lo InetAddress: /127.0.0.1 Display name: Wireless Network Connection Name: eth0 InetAddress: /192.0.2.0 

Da docs.oracle.com

Tutto questo è ancora attivo e funziona senza problemi! (dal 19 dicembre 2016)

Consiglio: non dipendere direttamente solo da uno di essi; prova ad usarne uno ma hai un piano di contagio considerando gli altri! Più usi, meglio è!

In bocca al lupo!

Crea un HttpURLConnection su un sito come http://www.whatismyip.com e analizzalo 🙂

http://jstun.javawi.de/ lo farà – a condizione che il tuo dispositivo gateway faccia STUN) la maggior parte fare)

Cosa ne pensi di questo? È semplice e ha funzionato al meglio per me 🙂

 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.MalformsdURLException; 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 (MalformsdURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } 

Non è così facile, dato che una macchina all’interno di una LAN di solito non si preoccupa dell’IP esterno del suo router su Internet .. semplicemente non ne ha bisogno!

Ti suggerirei di sfruttarlo aprendo un sito come http://www.whatismyip.com/ e ottenendo il numero IP analizzando i risultati html .. non dovrebbe essere così difficile!

Se si utilizza la webapp basata su JAVA e se si desidera catturare il client (uno che effettua la richiesta tramite un browser) ip esterno provare a distribuire l’app in un dominio pubblico e utilizzare request.getRemoteAddr () per leggere l’indirizzo IP esterno.

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