Java 中的 IPv6 可用性
IPv6 Availability in Java
有没有办法检查 Java 计算机网络是否能够处理 IPv6 连接?我不是在问如何检查字节数组是 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;
如果你想以更实用的方式执行上述操作,你可以查看这个小帮助方法。尽管使用流、函数和 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));
}
以上功能版本只是第一个接口,并未全部迭代。
迭代它们:
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));
}
有没有办法检查 Java 计算机网络是否能够处理 IPv6 连接?我不是在问如何检查字节数组是 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;
如果你想以更实用的方式执行上述操作,你可以查看这个小帮助方法。尽管使用流、函数和 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));
}
以上功能版本只是第一个接口,并未全部迭代。 迭代它们:
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));
}