17

我的问题类似于这个问题。我想获得我机器的真实 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<NetworkInterface> nInterfaces = NetworkInterface
                .getNetworkInterfaces();
        while (nInterfaces.hasMoreElements()) {
            Enumeration<InetAddress> 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 而ifconfig在我的 Ubuntu 机器上给出以下输出

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)?我只寻找 IPv4 地址,不包括127.0.0.0/8 subnet

4

3 回答 3

8

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

于 2013-05-08T15:44:26.640 回答
8

试试这个代码并粘贴你得到的:

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 地址

于 2013-05-08T15:45:24.953 回答
2

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

于 2013-05-08T15:45:48.367 回答