InetAddress.getLocalHost()。getHostAddress()返回127.0.1.1

我的问题与这个问题类似。 我想获得我的机器的真实IP(不是127.0.0.1)但很奇怪,我的Ubuntu中的以下代码返回127.0.1.1

InetAddress.getLocalHost().getHostAddress() 

以下是我的完整代码,最初发布在SO 这里

 public String getMachineIP() { try { String hostIP = InetAddress.getLocalHost().getHostAddress(); if (!hostIP.equals("127.0.0.1")) { return hostIP; } /* * Above method often returns "127.0.0.1", In this case we need to * check all the available network interfaces */ Enumeration nInterfaces = NetworkInterface .getNetworkInterfaces(); while (nInterfaces.hasMoreElements()) { Enumeration inetAddresses = nInterfaces .nextElement().getInetAddresses(); while (inetAddresses.hasMoreElements()) { String address = inetAddresses.nextElement() .getHostAddress(); if (!address.equals("127.0.0.1")) { return address; } } } } catch (UnknownHostException e1) { System.err.println("Error = " + e1.getMessage()); } catch (SocketException e1) { System.err.println("Error = " + e1.getMessage()); } return null; } 

上面的代码返回127.0.1.1而我的Ubuntu机器上的ifconfig给出了以下输出

 root@dell:~# ifconfig eth0 Link encap:Ethernet HWaddr 00:21:70:b7:30:cd UP BROADCAST MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) Interrupt:28 Base address:0x6000 eth1 Link encap:Ethernet HWaddr 00:22:68:d3:02:b5 inet addr:192.168.2.112 Bcast:192.168.2.255 Mask:255.255.255.0 inet6 addr: fe80::222:68ff:fed3:2b5/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:23827 errors:0 dropped:0 overruns:0 frame:32515 TX packets:23200 errors:46 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:22027719 (22.0 MB) TX bytes:3778268 (3.7 MB) Interrupt:19 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:402 errors:0 dropped:0 overruns:0 frame:0 TX packets:402 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:29197 (29.1 KB) TX bytes:29197 (29.1 KB) 

我在主机文件中找到127.0.1.1条目(对我来说很奇怪,因为我从未更新过这个文件)

 root@dell:~# cat /etc/hosts 127.0.0.1 localhost 127.0.1.1 dell # The following lines are desirable for IPv6 capable hosts ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters ff02::3 ip6-allhosts 

如何获得我的机器的真实IP(不是127.0.0.1)? 我只关注不包括127.0.0.0/8 subnet IPv4地址

您需要使用NetworkInterface来枚举网络接口; InetAddress.getLocalHost()始终返回环回。 这并不能解释为什么你得到127.0.1.1而不是127.0.0.1,但由于那种方法没有做你想做的事情,所以它似乎并不特别相关。 请参阅: http : //docs.oracle.com/javase/6/docs/api/java/net/NetworkInterface.html#getInetAddresses()

试试这段代码并粘贴你得到的东西:

 Enumeration en = NetworkInterface.getNetworkInterfaces(); while(en.hasMoreElements()){ NetworkInterface ni=(NetworkInterface) en.nextElement(); Enumeration ee = ni.getInetAddresses(); while(ee.hasMoreElements()) { InetAddress ia= (InetAddress) ee.nextElement(); System.out.println(ia.getHostAddress()); } } 

这将遍历绑定到主机的所有IP地址

整个127.0.0.0/8子网保留用于环回设备( 保留IP地址 )只需忽略任何以127开头的IP 🙂