1. Обзор
IP-адрес или адрес интернет-протокола однозначно идентифицирует устройство в Интернете. Поэтому знание идентификатора устройства, на котором запущено наше приложение, является ключевой частью некоторых приложений.
В этом руководстве мы рассмотрим различные методы получения IP-адреса нашего компьютера с помощью Java.
2. Найдите локальный IP-адрес
Во-первых, давайте рассмотрим некоторые методы получения локального IPv4-адреса текущей машины.
2.1. Локальный адрес с Java Net Library
Этот метод использует библиотеку Java Net для создания UDP-соединения:
try (final DatagramSocket datagramSocket = new DatagramSocket()) {
datagramSocket.connect(InetAddress.getByName("8.8.8.8"), 12345);
return datagramSocket.getLocalAddress().getHostAddress();
}
Здесь для простоты мы используем первичный DNS Google в качестве целевого хоста и указываем IP-адрес 8.8.8.8.
Сетевая библиотека Java в этот момент проверяет только правильность формата адреса, поэтому сам адрес может быть недоступен. Более того, мы используем случайный порт 12345
для создания UDP-соединения с помощью метода socket.connect() .
Под капотом он устанавливает все переменные, необходимые для отправки и получения данных, включая локальный адрес машины, фактически не отправляя никаких запросов хосту назначения.
Хотя это решение очень хорошо работает на компьютерах с Linux и Windows, оно вызывает проблемы в macOS и не возвращает ожидаемый IP-адрес.
2.2. Локальный адрес с подключением к сокету
В качестве альтернативы мы можем использовать сокетное соединение через надежное интернет-соединение для поиска IP-адреса :
try (Socket socket = new Socket()) {
socket.connect(new InetSocketAddress("google.com", 80));
return socket.getLocalAddress().getHostAddress();
}
Здесь, опять же для простоты, мы использовали google.com
с подключением к порту 80
, чтобы получить адрес хоста. Мы можем использовать любой другой URL-адрес для создания подключения к сокету, если он доступен.
2.3. Предостережения относительно сложных сетевых ситуаций
Перечисленные выше методы очень хорошо работают в случае простых сетевых ситуаций. Однако в случаях, когда машина имеет больше сетевых интерфейсов, поведение может быть не таким предсказуемым.
Другими словами, IP-адрес, возвращенный описанными выше функциями, будет адресом предпочтительного сетевого интерфейса на машине. Следовательно, он может отличаться от того, который мы ожидаем. Для конкретных нужд мы можем найти IP-адрес клиента, подключенного к серверу .
3. Найдите общедоступный IP-адрес
Подобно локальному IP-адресу, нам может понадобиться узнать общедоступный IP-адрес текущей машины. Общедоступный IP-адрес — это адрес IPv4, доступный из Интернета. Более того, он может не однозначно идентифицировать машину, ищущую адрес. Например, несколько хостов под одним и тем же маршрутизатором имеют один и тот же общедоступный IP-адрес.
Просто мы можем подключиться к URL-адресу Amazon AWS checkip.amazonaws.com
и прочитать ответ:
String urlString = "http://checkip.amazonaws.com/";
URL url = new URL(urlString);
try (BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream()))) {
return br.readLine();
}
Это хорошо работает большую часть времени. Однако мы явно зависим от внешнего источника, надежность которого не может быть гарантирована. Поэтому в качестве запасного варианта мы можем использовать любой из этих URL-адресов для получения общедоступного IP-адреса :
https://ipv4.icanhazip.com/
http://myexternalip.com/raw
http://ipecho.net/plain
4. Вывод
В этой статье мы узнали, как найти IP-адреса текущей машины и как получить их с помощью Java. Мы также рассмотрели различные методы проверки как локальных, так и общедоступных IP-адресов.
И, как всегда, исходный код примеров доступен на GitHub .