Java HttpURLConnection连接本地PHP服务报ConnectException求助
首先明确:Connection refused: connect是TCP连接建立阶段就被拒绝,流量根本没走到HTTP协议层,PHP服务完全收不到任何请求,因此你猜测的「PHP和URLConnection兼容性问题」「JDK拦截不安全HTTP请求」均不成立:兼容性问题只会出现在HTTP请求/响应解析阶段,会返回HTTP响应或报协议类错误;如果是JDK安全拦截HTTP请求,会抛出SecurityException或明确的HTTPS跳转相关异常,且你访问公网HTTP站点google.com正常,也能排除该可能。防火墙拦截环回流量是极个别安全软件的特殊行为,优先级放在最后排查即可。
按以下优先级从高到低排查:
1. 90%概率:PHP服务仅监听IPv6环回地址,Java默认走IPv4栈
Windows下绝大多数PHP集成环境(phpStudy、XAMPP、WAMP等)默认配置中,Web服务(Apache/Nginx)会优先绑定IPv6环回地址::1的80端口,不会绑定IPv4的0.0.0.0:80:
- Chrome、cURL等客户端默认优先尝试IPv6连接,访问
::1:80可以正常命中服务 - JDK 8及更早版本默认优先使用IPv4栈,尝试连接
127.0.0.1:80时,IPv4的80端口没有服务监听,会直接返回连接拒绝
验证方法
打开命令提示符执行命令:
netstat -ano | findstr ":80"
如果输出的监听记录只有:::80对应的条目,没有0.0.0.0:80的监听记录,即可确认是该问题。
修复方案
二选一即可:
- 方案1(推荐):修改Web服务(Apache/Nginx)的监听配置,将监听地址从
[::]:80改为0.0.0.0:80,重启服务后再测试 - 方案2:给IDEA中运行Java程序的JVM添加启动参数
-Djava.net.preferIPv6Addresses=true,让Java优先使用IPv6栈访问
2. 次常见原因:系统代理导致本地请求被转发到代理服务器
如果你的系统开了全局HTTP/SOCKS代理,部分JDK版本不会默认将localhost、127.0.0.1等环回地址加入代理排除列表,会把发往本地80端口的请求发给代理服务器,代理服务器访问不到你本地的服务,就会返回连接拒绝。
验证&修复
在发起连接的代码前加两行配置,强制环回地址不走代理:
// 配置HTTP、HTTPS请求不代理本地地址 System.setProperty("http.nonProxyHosts", "localhost|127.0.0.1|[::1]"); // 配置SOCKS代理不代理本地地址 System.setProperty("socksNonProxyHosts", "localhost|127.0.0.1|[::1]"); new URL("http://localhost/").openConnection().connect();
加完后如果连接正常,就是代理配置导致的问题,后续可以直接在JVM启动参数里永久配置该规则。
3. 端口占用冲突
执行第一步的netstat命令时,确认80端口的监听进程PID对应的是你启动的PHP Web服务进程(Apache/Nginx/php进程),避免IIS、其他代理软件、虚拟机服务占用了IPv4的80端口,导致Java访问IPv4端口时命中错误服务被拒绝。
4. 第三方安全软件拦截
如果以上排查都无效,临时退出所有第三方安全软件(360、火绒、企业端点防护软件等)、关闭系统防火墙测试。部分安全软件会对进程出站连接做过滤,可能拦截Java进程访问本地端口,测试正常后给Java进程加对应白名单即可。
内容的提问来源于stack exchange,提问作者iLittleWizard

