Я не слишком уверен, как получить внешний IP-адрес машины, как его увидит компьютер за пределами сети.
Мой следующий класс IPAddress получает только локальный IP-адрес машины.
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;
}
}
Ответы:
Я не уверен, что вы можете получить этот IP-адрес из кода, который выполняется на локальном компьютере.
Однако вы можете создать код, который работает на веб-сайте, скажем, в JSP, а затем использовать что-то, что возвращает IP-адрес, откуда пришел запрос:
request.getRemoteAddr()
Или просто используйте уже существующие службы, которые делают это, а затем проанализируйте ответ службы, чтобы узнать IP.
Используйте веб-сервис, например AWS и другие.
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);
источник
echo $_SERVER['REMOTE_ADDR'];
. Если это единственная или первая строка вывода сценария, все готово.Один из комментариев @stivlo заслуживает ответа:
Вы можете использовать сервис 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(); } } } } }
источник
На самом деле «вы не можете» в том смысле, что вы задали вопрос. NAT происходит вне протокола. Ядро вашей машины не может узнать, как ваш блок NAT отображает внешние IP-адреса на внутренние. Другие ответы здесь предлагают уловки, связанные с методами общения с внешними веб-сайтами.
источник
Все это до сих пор работает и работает без сбоев! (по состоянию на 23 сентября 2019 г.)
http://curlmyip.com/(17 декабря 2016 г.)Совет: не полагайтесь напрямую только на одного из них; попробуйте использовать один, но имейте план действий на случай непредвиденных обстоятельств, учитывая другие! Чем больше вы используете, тем лучше!
Удачи!
источник
Как писал @Donal Fellows, вы должны запрашивать сетевой интерфейс, а не машину. Этот код из javadocs работал у меня:
В следующем примере программы перечислены все сетевые интерфейсы и их адреса на машине:
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"); } }
Ниже приводится пример вывода из примера программы:
Display name: TCP Loopback interface Name: lo InetAddress: /127.0.0.1 Display name: Wireless Network Connection Name: eth0 InetAddress: /192.0.2.0
С сайта docs.oracle.com
источник
Сделайте HttpURLConnection к какому-нибудь сайту, например www.whatismyip.com, и проанализируйте его :-)
источник
Как насчет этого? Это просто и сработало лучше всего :)
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(); } } }
источник
http://jstun.javawi.de/ сделает это - при условии, что ваше устройство шлюза выполняет STUN) в большинстве случаев)
источник
Это не так просто, поскольку машина внутри локальной сети обычно не заботится о внешнем IP-адресе своего маршрутизатора, подключенного к Интернету ... ей это просто не нужно!
Я бы посоветовал вам воспользоваться этим, открыв такой сайт, как http://www.whatismyip.com/ и получив IP-адрес путем анализа результатов html ... это не должно быть так сложно!
источник
Если вы используете веб-приложение на основе JAVA и хотите получить внешний IP-адрес клиента (того, кто делает запрос через браузер), попробуйте развернуть приложение в общедоступном домене и использовать request.getRemoteAddr () для чтения внешнего IP-адреса.
источник
System.out.println(pageCrawling.getHtmlFromURL("http://ipecho.net/plain"));
источник
Альтернативное решение - выполнить внешнюю команду, очевидно, это решение ограничивает переносимость приложения.
Например, для приложения, работающего в Windows, команда PowerShell может выполняться через jPowershell, как показано в следующем коде:
public String getMyPublicIp() { // PowerShell command String command = "(Invoke-WebRequest ifconfig.me/ip).Content.Trim()"; String powerShellOut = PowerShell.executeSingleCommand(command).getCommandOutput(); // Connection failed if (powerShellOut.contains("InvalidOperation")) { powerShellOut = null; } return powerShellOut; }
источник