因此,我有一个要求,即我需要访问 URL,同时首选 IPV6
(如果可用)。
这是我的代码。
private HttpURLConnection getConnection(URL url) throws IOException {
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoOutput(true);
conn.setConnectTimeout(15 * 1000);
conn.setRequestMethod("GET");
conn.setRequestProperty("User-Agent", "Mozilla/4.76");
conn.setUseCaches(false);
return conn;
}
我正在通过缓冲读取器
读取连接输出。
HttpURLConnection conn = getConnection(new URL(API + urlParameters));
return new BufferedReader(new InputStreamReader(conn.getInputStream())).readLine();
问题发生在 BufferedReader 上,引发错误
net.SocketException:网络无法访问:连接
但是当我从应用程序中删除此代码块时,该程序将按预期运行。 System.setProperty("java.net.preferIPv6Addresses", "true");
但是,即使用户可以使用 IPv6
,它当然也会发送 IPv4
IP 地址,如果用户无法使用 IPv6
,我该如何让它发送 IPv6
IP 地址?
请您参考如下方法:
之前使用此代码测试 IPv6 支持:
private static boolean supportsIPv6() throws SocketException {
Enumeration<NetworkInterface> e = NetworkInterface.getNetworkInterfaces();
while (e.hasMoreElements()) {
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;
}