为了账号安全,请及时绑定邮箱和手机立即绑定

Java 中的 IPv6 可用性

Java 中的 IPv6 可用性

莫回无 2021-07-16 18:08:18
如果计算机网络能够处理 IPv6 连接,有没有办法检查 Java?我不是在问如何检查字节数组是 IPv4 地址还是 IPv6,或者 InetAddress 是其中之一,而是如何判断网络本身是否支持这种连接。
查看完整描述

3 回答

?
开心每一天1111

TA贡献1836条经验 获得超13个赞

是的; 您可以循环遍历接口并检查它们中是否有任何一个不是环回的 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;


查看完整回答
反对 回复 2021-07-29
?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

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


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

}


查看完整回答
反对 回复 2021-07-29
?
胡说叔叔

TA贡献1804条经验 获得超8个赞

如果您希望以更实用的方式实现上述功能,您可以查看这个小助手方法。尽管使用了流、函数和 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));


}


查看完整回答
反对 回复 2021-07-29
  • 3 回答
  • 0 关注
  • 234 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信