因此,我有一个要求,即我需要访问 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; 
} 


评论关闭
IT源码网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!