Java抛出SocketException: Socket is not connected: connect异常求助
解决HttpsURLConnection Socket连接异常问题
你遇到的java.net.SocketException: Socket is not connected: connect异常,通常和网络连接、代理配置或者SSL设置有关,结合你已经尝试的代理配置,给你几个具体的排查和解决方向:
1. 修正代理配置的细节问题
- 首先检查你设置的代理参数:
proxy、port、user、password必须是真实有效的,注意你提供的代码里password后面有个多余的空格,这会直接导致代理认证失败! - 系统属性的设置必须在创建
URL和HttpsURLConnection之前执行,否则配置不会生效,正确的顺序应该是:// 先设置代理属性 System.setProperty("https.proxyHost", "your-proxy-host"); System.setProperty("https.proxyPort", "your-proxy-port"); System.setProperty("https.proxyUser", "your-proxy-user"); System.setProperty("https.proxyPassword", "your-proxy-password"); // 再创建连接 URL urlSP = new URL("https://www.google.fr/"); HttpsURLConnection connSP = (HttpsURLConnection) urlSP.openConnection(); connSP.connect();
2. 手动为连接指定代理(替代系统属性)
有时候系统属性的代理配置可能因为环境问题不生效,你可以直接为当前连接设置代理对象,同时处理认证:
URL urlSP = new URL("https://www.google.fr/"); // 替换成真实的代理地址和端口 Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("proxy-host", 8080)); HttpsURLConnection connSP = (HttpsURLConnection) urlSP.openConnection(proxy); // 如果代理需要用户名密码认证,设置认证器 Authenticator.setDefault(new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication("proxy-user", "proxy-password".toCharArray()); } }); connSP.connect();
3. 排查网络与防火墙拦截
- 先在浏览器中访问
https://www.google.fr/,确认网络本身能正常访问目标地址 - 检查本地防火墙、杀毒软件是否拦截了Java程序的网络请求
- 使用
ping或telnet测试代理服务器的连通性,比如telnet proxy-host 8080,确认代理端口是开放的
4. 排除SSL证书相关问题
虽然报错是Socket连接异常,但部分情况下SSL证书验证失败也会伪装成连接问题,测试环境下可以临时跳过证书验证(生产环境禁止使用):
// 初始化信任所有证书的SSL上下文 TrustManager[] trustAllCerts = new TrustManager[]{ new X509TrustManager() { public X509Certificate[] getAcceptedIssuers() { return null; } public void checkClientTrusted(X509Certificate[] certs, String authType) {} public void checkServerTrusted(X509Certificate[] certs, String authType) {} } }; SSLContext sc = SSLContext.getInstance("TLS"); sc.init(null, trustAllCerts, new SecureRandom()); HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); // 跳过主机名验证 HostnameVerifier allHostsValid = (hostname, session) -> true; HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid); // 之后再创建连接 URL urlSP = new URL("https://www.google.fr/"); HttpsURLConnection connSP = (HttpsURLConnection) urlSP.openConnection(); connSP.connect();
5. 开启调试日志定位问题
添加系统属性开启网络和SSL调试日志,能帮你看到连接过程的详细信息:
System.setProperty("javax.net.debug", "ssl,handshake,network");
运行代码后会输出大量日志,你可以从中找到连接失败的具体原因,比如代理认证失败、SSL握手失败等。
内容的提问来源于stack exchange,提问作者W.G
相关产品推荐
相关产品推荐

