Что может случиться в Linux, так это то, что InetAddress.getLocalHost()
вернет адрес обратной связи (в 127/8, обычно 127.0.0.1). Таким образом, имя, взятое из файла /etc/hosts
, вероятно, будет localhost.localdomain
.
Чтобы получить правильный адрес / имя хоста, вместо этого вы можете использовать следующий код, который перечислит все IP-адреса, связанные с сетевым интерфейсом (eth0
в моем примере), и мы выберем один IPv4 , который не принадлежит классу loopback.
try {
// Replace eth0 with your interface name
NetworkInterface i = NetworkInterface.getByName("eth0");
if (i != null) {
Enumeration<InetAddress> iplist = i.getInetAddresses();
InetAddress addr = null;
while (iplist.hasMoreElements()) {
InetAddress ad = iplist.nextElement();
byte bs[] = ad.getAddress();
if (bs.length == 4 && bs[0] != 127) {
addr = ad;
// You could also display the host name here, to
// see the whole list, and remove the break.
break;
}
}
if (addr != null) {
System.out.println( addr.getCanonicalHostName() );
}
} catch (...) { ... }
Вы можете немного изменить код для отображения всех адресов, см. Комментарии внутри кода.
редактировать
Возможно, вы захотите перебрать и другие сетевые карты, как предлагает @ rafalmag
вместо NetworkInterface.getByName ("eth0") я предлагаю перебрать NetworkInterface.getNetworkInterfaces ()