是否可以通过Java来检查计算机网络是否能够处理IPv6连接?我不是在问如何检查字节数组是IPv4地址还是IPv6,或者不是InetAddress是一个或另一个,而是如何判断网络本身是否支持这种连接。
答案 0 :(得分:4)
是;您可以只循环浏览接口,并检查其中是否有不是回送的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;
答案 1 :(得分:1)
以上功能版本只是第一个界面,并非全部迭代。 要全部迭代它们:
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));
}
答案 2 :(得分:0)
如果您希望以更实用的方式进行上述操作,则可以检查此辅助方法。即使使用流,函数和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));
}