Получение "внешнего" 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-адрес из кода, который работает на локальном компьютере.
однако вы можете создать код, который работает на веб-сайте, скажем, в 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);
один из комментариев @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-адрес клиента (тот, кто делает запрос через браузер), попробуйте развернуть приложение в общественное достояние и использовать запрос.getRemoteAddr () для чтения внешнего IP-адреса.