java InetAddress.getLocalHost();返回 127.0.0.1 ...如何获得真正的IP?

2022-08-31 17:34:26

我正在编写一个简单的网络应用程序。我需要知道网络上我的机器的真实IP,例如192.168.1.3 。getLocalHost返回127.0.0.1(在Linux上,我不知道它在Windows上是否相同)。怎么办?


答案 1

如果您实际上想要使用计算机上的所有 IP 地址,则可以使用 NetworkInterface 类获取这些地址。当然,然后你需要你真正想要使用哪一个,但这会有所不同,这取决于你使用它的目的,或者你可能需要扩展你使用它的方式来解释多个地址。

import java.net.*;
import java.util.*;

public class ShowInterfaces
{
        public static void main(String[] args) throws Exception
        {
                System.out.println("Host addr: " + InetAddress.getLocalHost().getHostAddress());  // often returns "127.0.0.1"
                Enumeration<NetworkInterface> n = NetworkInterface.getNetworkInterfaces();
                for (; n.hasMoreElements();)
                {
                        NetworkInterface e = n.nextElement();
                        System.out.println("Interface: " + e.getName());
                        Enumeration<InetAddress> a = e.getInetAddresses();
                        for (; a.hasMoreElements();)
                        {
                                InetAddress addr = a.nextElement();
                                System.out.println("  " + addr.getHostAddress());
                        }
                }
        }
}

答案 2

由于计算机可能有多个地址,因此很难确定哪一个地址适合您。通常,您希望系统根据其路由表分配 IP。由于结果取决于您要连接到的IP,因此有一个简单的技巧:只需创建一个连接,然后查看您从操作系统获得的地址:

// output on my machine: "192.168.1.102"
Socket s = new Socket("192.168.1.1", 80);
System.out.println(s.getLocalAddress().getHostAddress());
s.close();

// output on my machine: "127.0.1.1"
System.out.println(InetAddress.getLocalHost().getHostAddress());

我不确定是否有可能在不建立连接的情况下执行此操作。我想我曾经用Perl(或C?)做到这一点,但不要问我关于Java的问题。我认为有可能在不实际连接的情况下创建一个UDP套接字(DatagramSocket)。

如果途中有NAT路由器,您将无法获得远程主机将看到的IP。但是,正如你以192.*为例,我认为你并不在乎。


推荐