代码之家  ›  专栏  ›  技术社区  ›  Lev Knoblock

Java中的IPv6可用性

  •  2
  • Lev Knoblock  · 技术社区  · 6 年前

    2 回复  |  直到 6 年前
        1
  •  4
  •   user1133275    6 年前

    是的;您只需循环访问接口,然后检查它们中是否有一个不是循环回的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;
    
        2
  •  1
  •   Vladimir Kvashin    4 年前

    上面的函数版本只是第一个接口,而不是全部迭代。

    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));
    }
    
        3
  •  0
  •   akourt    6 年前

    如果您想以更实用的方式实现上述功能,可以检查这个小助手方法。尽管它使用流、函数和lambdas,但它确实做了上面提到的事情。

    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));
    
    }