Перейти к основному содержимому

Получить IP-адрес текущей машины с помощью Java

· 3 мин. чтения

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 .