Итак, я пытаюсь получить IP-адрес моей машины в моей локальной сети (который должен быть 192.168.178.41
).
Моим первым намерением было использовать что-то вроде этого:
InetAddress.getLocalHost().getHostAddress();
, но он возвращает только 127.0.0.1
, что правильно, но не очень полезно для меня.
Я поискал и нашел этот ответ https://stackoverflow.com/a/2381398/717341 , который просто создает Socket
-соединение к некоторой веб-странице (например, "google.com") и получает адрес локального хоста из сокета:
Socket s = new Socket("google.com", 80);
System.out.println(s.getLocalAddress().getHostAddress());
s.close();
Это работает на моем компьютере (возвращает 192.168.178.41
), но ему необходимо подключиться к Интернету, чтобы Работа. Поскольку моему приложению не требуется подключение к Интернету, и то, что приложение пытается подключиться к Google каждый раз при запуске, может показаться "подозрительным", мне не нравится идея его использования.
Итак, после некоторого дополнительного исследования я наткнулся на класс NetworkInterface
, который (после некоторой работы) также возвращает желаемый IP-адрес:
Enumeration interfaces = NetworkInterface.getNetworkInterfaces();
while (interfaces.hasMoreElements()){
NetworkInterface current = interfaces.nextElement();
System.out.println(current);
if (!current.isUp() || current.isLoopback() || current.isVirtual()) continue;
Enumeration addresses = current.getInetAddresses();
while (addresses.hasMoreElements()){
InetAddress current_addr = addresses.nextElement();
if (current_addr.isLoopbackAddress()) continue;
System.out.println(current_addr.getHostAddress());
}
}
На моей машине это возвращает следующее:
name:eth1 (eth1)
fe80:0:0:0:226:4aff:fe0d:592e%3
192.168.178.41
name:lo (lo)
Он находит оба моих сетевых интерфейса и возвращает желаемый IP-адрес, но я не уверен, какой другой адрес ( fe80: 0: 0: 0: 226: 4aff: fe0d: 592e% 3
) средства.
Кроме того, я не нашел способа отфильтровать его из возвращенных адресов (с помощью методов isXX ()
объекта InetAddress
), кроме использования RegEx , который я считаю очень "грязным".
Есть другие мысли, кроме использования RegEx или Интернета?