Итак, я пытаюсь получить 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<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
while (interfaces.hasMoreElements()){
NetworkInterface current = interfaces.nextElement();
System.out.println(current);
if (!current.isUp() || current.isLoopback() || current.isVirtual()) continue;
Enumeration<InetAddress> 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 или Интернета?