java - 查找本地机器 IP 地址,无误报

标签 java networking ip ipv4

我尝试使用 Java 查找我的 PC 的本地 IP 地址。然而,结果并不正确。具体来说,我需要通过 ipconfig 命令获取无线 LAN 适配器 WiFi IPv4 地址。我查看了许多不同的问题,例如 this excellent answer但目前还不清楚如何在 Java 中做到这一点。 InetAddress.getLocalHost() 返回错误的 IP(“以太网适配器 VirtualBox 仅主机网络”)。

我尝试了以下代码:

public static List<String> getLocalIPAddresses() throws Exception
{
    val networkInterfaces = NetworkInterface.getNetworkInterfaces();
    val localIPAddresses = new ArrayList<String>();

    while (networkInterfaces.hasMoreElements())
    {
        for (val interfaceAddress : networkInterfaces.nextElement().getInterfaceAddresses())
        {
            val address = interfaceAddress.getAddress();

            // Find the local IP addresses
            if (address.isSiteLocalAddress())
            {
                val localIPAddress = interfaceAddress.getAddress().toString().replace("/", "");
                localIPAddresses.add(localIPAddress);
            }
        }
    }

    if (localIPAddresses.isEmpty())
    {
        throw new IllegalStateException("Expected the computer's local IP address but didn't get one!");
    }

    return localIPAddresses;
}

注意:
val 来自Lombok .

在我的机器上,这会返回 2 个 IP 地址的列表:

192.168.56.1
192.168.2.103

“以太网适配器 VirtualBox 仅主机网络”和正确的“无线 LAN 适配器 WiFi”。我可以做什么来始终保证后者?显然检查 isSiteLocalAddress() (又名本地 IP 地址)是不够的。代码方面还可以做什么?过滤掉“VirtualBox”并不是一个万无一失的解决方案,特别是因为网络接口(interface)名称与语言相关:

public static List<String> getLocalIPAddresses() throws Exception
{
    val networkInterfaces = NetworkInterface.getNetworkInterfaces();
    val localIPAddresses = new ArrayList<String>();

    while (networkInterfaces.hasMoreElements())
    {
        val networkInterface = networkInterfaces.nextElement();
        val displayName = networkInterface.getDisplayName();

        if (!displayName.contains("VirtualBox"))
        {
            for (val interfaceAddress : networkInterface.getInterfaceAddresses())
            {
                val address = interfaceAddress.getAddress();

                // Find the local IP addresses
                if (address.isSiteLocalAddress())
                {
                    val localIPAddress = interfaceAddress.getAddress().toString().replace("/", "");
                    localIPAddresses.add(localIPAddress);
                }
            }
        }
    }

    if (localIPAddresses.isEmpty())
    {
        throw new IllegalStateException("Expected the computer's local IP address but didn't get one!");
    }

    return localIPAddresses;
}

我需要一个独立于平台的解决方案。不过我用的是 Windows。

最佳答案

为什么不使用 isVirtual() 方法。

static List<String> getLocalIpAddress() throws SocketException {
    Enumeration<NetworkInterface> networkInterfaces = null;
    List<String> localIpAddress = new ArrayList<String>();

    networkInterfaces = NetworkInterface.getNetworkInterfaces();

    while (networkInterfaces.hasMoreElements()) {
        NetworkInterface ni = networkInterfaces.nextElement();
        System.out.println("=== <" + ni.getDisplayName() + "> ===");

        if (!ni.isUp()) {
            for (InterfaceAddress addr : ni.getInterfaceAddresses()) {
                System.out.println("not up : " + addr.getAddress().getHostAddress());
            }
            continue;
        }
        if (ni.isLoopback()) {
            for (InterfaceAddress addr : ni.getInterfaceAddresses()) {
                System.out.println("loopback : " + addr.getAddress().getHostAddress());
            }
            continue;
        }
        if (ni.isVirtual()) {
            for (InterfaceAddress addr : ni.getInterfaceAddresses()) {
                System.out.println("virtual : " + addr.getAddress().getHostAddress());
            }
            continue;
        }

        if (!ni.isPointToPoint()) {
            for (InterfaceAddress addr : ni.getInterfaceAddresses()) {
                System.out.println("not ppp : " + addr.getAddress().getHostAddress());
            }
            continue;
        }

        for (InterfaceAddress addr : ni.getInterfaceAddresses()) {
            InetAddress address = addr.getAddress();
            if (address.isLinkLocalAddress()) {
                System.out.println("link local address: " + address.getHostName() + address.getHostAddress());
                continue;
            }
            if (address.isSiteLocalAddress()) {
                System.out.println("site local address: " + address.getHostName() + address.getHostAddress());
                continue;
            }

            System.out.println("getHostName: " + address.getHostName());
            System.out.println("getHostAddress : " + address.getHostAddress());
            System.out.println("------separator-------");

            localIpAddress.add(address.getHostAddress());
        }
    }

    return localIpAddress;
}

关于java - 查找本地机器 IP 地址,无误报,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47607881/

相关文章:

java - 单元测试多个连续的键盘输入

java - JPA/Hibernate OnetoMany 防止重复子项

java - 适用于套接字流的C++/Java序列化库?

java - 通过IP地址查找国家

java - Java 中的服务器,C 中的客户端 - 无法获取数据

java - 如何在java中删除日志文件中的日期和时间

java - Java 中嵌套集合/结构的类型安全展平

python - 在 Python 中返回一个 ping 测试结果

ssl - 确定 TCP 连接是否使用 SSL

javascript - 检索客户端请求的 ip 地址