Obtendo o endereço IP ‘externo’ em Java

Eu não estou muito certo sobre como obter o endereço IP externo da máquina como um computador fora de uma rede iria vê-lo.

Minha class IPAddress a seguir obtém apenas o endereço IP local da 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; } } 

Não tenho certeza se você pode pegar esse IP do código que é executado na máquina local.

No entanto, você pode criar código que é executado em um site, digamos em JSP, e usar algo que retorne o IP de onde a solicitação veio:

request.getRemoteAddr()

Ou simplesmente use serviços já existentes que fazem isso e, em seguida, analise a resposta do serviço para descobrir o IP.

Use um serviço da Web como o AWS e outros

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

Um dos comentários de @stivlo merece ser uma resposta:

Você pode usar o serviço da 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(); } } } } } 

A verdade é que “você não pode” no sentido em que fez a pergunta. O NAT acontece fora do protocolo. Não há como o kernel da sua máquina saber como sua checkbox NAT está sendo mapeada de endereços IP internos para externos. Outras respostas aqui oferecem truques envolvendo methods de falar com sites externos.

Como @Donal Fellows escreveu, você precisa consultar a interface de rede em vez da máquina. Este código dos javadocs funcionou para mim:

O programa de exemplo a seguir lista todas as interfaces de rede e seus endereços em uma 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 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"); } } 

O seguinte é exemplo de saída do programa de exemplo:

 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

Tudo isso ainda está funcionando bem! (a partir de 19 de dezembro de 2016)

Peça de conselho: Não direcly dependem apenas de um deles; tente usar um, mas tenha um plano de contingência considerando os outros! Quanto mais você usa, melhor!

Boa sorte!

Faça um HttpURLConnection em algum site como http://www.whatismyip.com e analise isso 🙂

http://jstun.javawi.de/ vai fazê-lo – desde que o dispositivo de gateway faz STUN) mais fazer)

Que tal agora? É simples e funcionou melhor para mim 🙂

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

Não é assim tão fácil, já que uma máquina dentro de uma LAN geralmente não se importa com o IP externo de seu roteador para a internet … simplesmente não precisa disso!

Eu sugeriria que você explorasse isso abrindo um site como http://www.whatismyip.com/ e obtendo o número de IP analisando os resultados em html. Não deveria ser tão difícil!

Se você estiver usando webapp baseado em JAVA e se você quiser pegar o cliente (aquele que faz a solicitação através de um navegador) ip externo tente implantar o aplicativo em um domínio público e use request.getRemoteAddr () para ler o endereço IP externo.

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