Получение "внешнего" IP-адреса в Java
Я не слишком уверен, как получить внешний 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;
}
}
11 ответов:
Я не уверен, что вы можете захватить этот 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);
один из комментариев @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-адресатами. Другие ответы здесь предлагают трюки, связанные с методами общения с внешними веб-сайтами.
все это еще и работает! (по состоянию на 19 декабря 2016)
- http://checkip.amazonaws.com/
- http://icanhazip.com/
- http://www.trackip.net/ip
- http://myexternalip.com/raw
- http://ipecho.net/plain
http://curlmyip.com/(17 Dec 2016)- http://bot.whatismyipaddress.com
совет: не зависите напрямую только от одного из них; попробуйте использовать один, но иметь план смежности, учитывая другие! Чем больше вы используете, тем лучше!
удачи!
Как писал @ 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
http://jstun.javawi.de/ сделает это-при условии, что ваше устройство шлюза оглушает) большинство делает)
Как насчет этого? Это просто и работает лучше для меня:)
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(); } } }
Это не так просто, так как машина внутри локальной сети обычно не заботится о внешнем IP своего маршрутизатора в интернет.. это просто не нужно!
Я бы предложил вам использовать это, открыв сайт, как http://www.whatismyip.com/ и получение IP-номера путем анализа результатов html.. это не должно быть так тяжело!
Если вы используете веб-приложение на основе JAVA и хотите захватить внешний ip-адрес клиента (тот, кто делает запрос через браузер), попробуйте развернуть приложение в public domain и использовать запрос.getRemoteAddr () для чтения внешнего IP-адреса.
Comments