You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 19:45:31