繁体   English   中英

Java 中的 IPv6 可用性

[英]IPv6 Availability in Java

如果计算机网络能够处理 IPv6 连接,有没有办法检查 Java? 我不是在问如何检查字节数组是 IPv4 地址还是 IPv6,或者 InetAddress 是其中之一,而是如何判断网络本身是否支持这种连接。

是的; 您可以循环遍历接口并检查它们中是否有任何一个不是环回的 IPv6 地址。

final Enumeration<NetworkInterface> e = NetworkInterface.getNetworkInterfaces();
while (e.hasMoreElements()) {
    final Iterator<InterfaceAddress> e2 = e.nextElement().getInterfaceAddresses().iterator();
    while (e2.hasNext()) {
        final InetAddress ip = e2.next().getAddress();
        if (ip.isLoopbackAddress() || ip instanceof Inet4Address){
            continue;
        }
        return true;
    }
}
return false;

上面的功能版本只是第一个接口,不是全部迭代。 将它们全部迭代:

private static boolean supportsIPv6() throws SocketException {
    return Collections.list(NetworkInterface.getNetworkInterfaces()).stream()
            .map(NetworkInterface::getInterfaceAddresses)
            .flatMap(Collection::stream)
            .map(InterfaceAddress::getAddress)
            .anyMatch(((Predicate<InetAddress>) InetAddress::isLoopbackAddress).negate().and(address -> address instanceof Inet6Address));
}

如果您希望以更实用的方式实现上述功能,您可以查看这个小助手方法。 尽管使用了流、函数和 lambda 表达式,但它确实执行了上述操作。

private static boolean supportsIPv6() throws SocketException {
    return Stream.of(NetworkInterface.getNetworkInterfaces().nextElement())
                 .map(NetworkInterface::getInterfaceAddresses)
                 .flatMap(Collection::stream)
                 .map(InterfaceAddress::getAddress)
                 .anyMatch(((Predicate<InetAddress>) InetAddress::isLoopbackAddress).negate().and(address -> address instanceof Inet6Address));

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM