【问题标题】:Safe method to get computer IP on UNIX using Java使用 Java 在 UNIX 上获取计算机 IP 的安全方法
【发布时间】:2013-06-21 22:39:18
【问题描述】:

我需要使用 Java 从 Ubuntu 获取计算机 IP。我尝试使用 InetAddress.getLocalHost.getHostAddress().toString(); 但它返回 127.0.0.1 。我正在寻找解决方案,发现了这段代码:

NetworkInterface ni = NetworkInterface.getByName("eth0");
    Enumeration<InetAddress> inetAddresses =  ni.getInetAddresses();


    while(inetAddresses.hasMoreElements()) {
        InetAddress ia = inetAddresses.nextElement();
        if(!ia.isLinkLocalAddress()) {
            System.out.println("IP: " + ia.getHostAddress());
        }
    }
}

此代码对我有用,但问题是当计算机使用“eth1”接口或计算机可以使用无线适配器连接到网络(wlan0)时。在那种情况下,程序将失败。你们能告诉我从 UNIX 系统获取 IP 的安全方法吗?问候。

【问题讨论】:

  • “安全”是指“可靠”而不是“危险”的反义词,对吧?
  • 是的。我的意思是适用于所有 UNIX 系统的方法。如果机器使用除“eth0”之外的其他接口,我的方法是危险的,因为 Window InetAddress.getLocalHost.getHostAddress().toString() 正在工作。
  • 如果计算机在家庭无线防火墙/路由器后面使用怎么办?这些路由器通常将 192.168.1.x 之类的地址分配给家中的计算机——并多路复用分配给家中的实际互联网地址。如果防火墙允许并路由传入,则计算机的地址 (192.168.1.101) 可能不是可以在 Internet (32.78.23.4) 上联系计算机的地址。
  • 除了一台机器可以使用多个网络接口,每个网络接口可以分配多个ip地址,还有一个问题,如果你想要本地地址(例如,决定服务器进程应该绑定到哪个地址)或公共互联网地址(为了知道对等方应该连接到哪个地址)。
  • 一些计算机不会知道他们的外部 IP - 尝试向远程服务器发送请求

标签: java unix inetaddress


【解决方案1】:

虽然一台计算机可以有多个网络接口和不同的 IP,但某些接口也可能是环回或不运行。为了“安全”,您甚至可能需要检查接口的名称以查看您是否使用了所需的 IP 地址。

以下方法将为您提供来自非环回、启动和运行接口的 IP 地址列表。

 public static List<InetAddress> getIPAddress() throws SocketException {

    List<InetAddress> ipAddresses = new ArrayList<InetAddress>();
    Enumeration e;
    e = NetworkInterface.getNetworkInterfaces();
    while (e.hasMoreElements()) {
        NetworkInterface ni = (NetworkInterface) e.nextElement();
        if (ni.isLoopback() || !ni.isUp()) continue;

        for (Enumeration e2 = ni.getInetAddresses(); e2.hasMoreElements(); ) {
            InetAddress ip = (InetAddress) e2.nextElement();
            ipAddresses.add(ip);
        }
    }
    return ipAddresses;
}

【讨论】:

    【解决方案2】:

    使用枚举getNetworkInterfaces(); 并循环遍历它们。

                       Enumeration<NetworkInterface> eni = NetworkInterface.getNetworkInterfaces();
    
                        while (eni.hasMoreElements()) {
                                NetworkInterface ni = eni.nextElement();
                                Enumeration<InetAddress> inetAddresses =  ni.getInetAddresses();
    
    
                                while(inetAddresses.hasMoreElements()) {
                                        InetAddress ia = inetAddresses.nextElement();
                                        if(!ia.isLinkLocalAddress()) {
                                                System.out.println("Interface: " + ni.getName() + "   IP: " + ia.getHostAddress());
    
                                        }
                                }
                        }
    

    在我的 linux 机器上,isLinkLocalAddress() 似乎无法正常工作,因为我得到了 127.0.0.1,但是 ipv6 版本很容易手动过滤掉。

    Interface: wlan0   IP: 192.168.0.8
    Interface: lo   IP: 0:0:0:0:0:0:0:1%1
    Interface: lo   IP: 127.0.0.1
    

    我的机器只连接在192.168.0.8上的无线接口

    【讨论】:

      【解决方案3】:

      查看这个 SO 问题的答案:

      How to enumerate IP addresses of all enabled NIC cards from Java?

      我没有测试过,但它似乎适用。

      【讨论】:

        猜你喜欢
        • 2011-11-04
        • 1970-01-01
        • 2015-06-02
        • 1970-01-01
        • 2013-07-27
        • 1970-01-01
        • 1970-01-01
        • 2014-09-30
        • 2012-09-01
        相关资源
        最近更新 更多