127.0.0.1 - это петлевой адаптер - это совершенно правильный ответ на (несколько неправильный) вопрос «какой у меня IP-адрес?»
Проблема в том, что несколько правильных ответов на этот вопрос.
РЕДАКТИРОВАТЬ: документы для getLocalHost
сказать:
Если есть менеджер безопасности, его
Метод checkConnect вызывается с
имя локального хоста и -1 как его
аргументы, чтобы увидеть, если операция
позволил. Если операция не
разрешено, InetAddress представляет
адрес обратной связи возвращается.
Возможно ли, что изменение в поведении связано с изменением разрешений?
РЕДАКТИРОВАТЬ: Я считаю, что NetworkInterface.getNetworkInterfaces
это то, что вам нужно перечислить все возможности. Вот пример, который не показывает виртуальные адреса, но работает для «основных» интерфейсов:
import java.net.*;
import java.util.*;
public class Test
{
public static void main(String[] args)
throws Exception // Just for simplicity
{
for (Enumeration<NetworkInterface> ifaces =
NetworkInterface.getNetworkInterfaces();
ifaces.hasMoreElements(); )
{
NetworkInterface iface = ifaces.nextElement();
System.out.println(iface.getName() + ":");
for (Enumeration<InetAddress> addresses =
iface.getInetAddresses();
addresses.hasMoreElements(); )
{
InetAddress address = addresses.nextElement();
System.out.println(" " + address);
}
}
}
}
(Я забыл, насколько ужасно работать с типом Enumeration<T>
напрямую!)
Вот результаты на моем ноутбуке прямо сейчас:
lo:
/127.0.0.1
eth0:
/169.254.148.66
eth1:
eth2:
ppp0:
/10.54.251.111
(я не думаю, что это выдаёт чрезвычайно конфиденциальную информацию:)
Если вы знаете, какой сетевой интерфейс вы хотите использовать, позвоните по номеру NetworkInterface.getByName(...)
и посмотрите на адреса этого интерфейса (как показано в коде выше).