24

我正在尝试获取本地 IP。它应该与

System.out.println(Inet4Address.getLocalHost().getHostAddress());

或者

InetAddress addr = InetAddress.getLocalHost();
ip = addr.getHostAddress();
System.out.println("Ip: " + ip);

但它总是返回192.168.178.154而不是192.168.178.119(这是我真正的本地 IP(终端 --> ifconfig))

我该怎么办?

4

2 回答 2

36

听起来你有两个 IP 地址。

在具有一个网络适配器的计算机上,选择的 IP 地址是计算机中网络适配器的主 IP 地址。但是,在多宿主计算机上,堆栈必须首先做出选择。在知道连接的目标 IP 地址之前,堆栈无法做出明智的选择。

当程序向目标 IP 地址发送 connect() 调用,或向 UDP 数据报发送 send() 调用时,堆栈引用目标 IP 地址,然后检查 IP 路由表以便选择最佳网络发送数据包的适配器。选择此网络适配器后,堆栈会读取与该网络适配器关联的主 IP 地址,并将该 IP 地址用作出站数据包的源 IP 地址。

文档

如果要激活第二个 IP 及其例如 LAN,请将其拔下并在 10 秒后重新插入。其他 IP 可能会被选为路由表中的主机 IP。

您可以从getNetworkInterfaces.

尝试运行以下代码:

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

        Enumeration<InetAddress> a = e.getInetAddresses();
        for (; a.hasMoreElements();)
        {
            InetAddress addr = a.nextElement();
            System.out.println("  " + addr.getHostAddress());
        }
    }
} 
于 2013-10-20T11:37:49.207 回答
9

如果您的系统配置了多个 ip,那么就这样做。

try {
  InetAddress inet = InetAddress.getLocalHost();
  InetAddress[] ips = InetAddress.getAllByName(inet.getCanonicalHostName());
  if (ips  != null ) {
    for (int i = 0; i < ips.length; i++) {
      System.out.println(ips[i]);
    }
  }
} catch (UnknownHostException e) {

}
于 2013-10-20T11:41:38.353 回答