Java调用Node.js Express API服务器遇ConnectException问题求助
Node.js与Java交互连接失败问题排查与解决
问题描述
搭建Node.js Express API服务器实现与Java的数据交互,服务器已在局域网运行,但Java发送POST请求时出现错误:java.net.ConnectException: Failed to connect to /127.0.0.1:10000,同一环境下JavaScript客户端用fetch可正常请求。
问题原因及解决方案
1. 服务器绑定地址限制(最可能)
Express默认仅绑定127.0.0.1(本地回环地址),仅允许本机访问。如果Java程序在局域网另一台设备运行,无法通过该地址连接。
- 解决方法:修改
app.listen的绑定地址为0.0.0.0,允许所有网卡接入:
app.listen(PORT, '0.0.0.0', function (err) { if (err) console.log("Error in server setup"); console.log("Server listening on Port", PORT); });
2. Java访问IP错误
若Java程序与Node.js服务器不在同一台机器,使用127.0.0.1会指向Java本机而非服务器。
- 解决方法:将Java代码中的URL替换为服务器的局域网真实IP(如
192.168.x.x):
String url = "http://192.168.1.100:10000/api/server"; // 替换为你的服务器局域网IP
3. 防火墙/端口拦截
服务器或Java所在设备的防火墙可能拦截了10000端口的通信。
- 解决方法:
- 服务器端:开放10000端口(Linux用
ufw allow 10000,Windows在防火墙高级设置添加入站规则) - 测试连通性:用
telnet 服务器IP 10000或curl http://服务器IP:10000/api/server验证端口是否可访问
- 服务器端:开放10000端口(Linux用
4. 端口占用或服务器未正常启动
可能存在端口被其他程序占用,或服务器启动有隐藏错误。
- 解决方法:
- 检查端口占用:Windows执行
netstat -ano | findstr :10000,Linux执行lsof -i :10000 - 查看Node.js服务器日志,确认是否成功监听10000端口
- 检查端口占用:Windows执行
相关代码
index.js
"use strict"; const express = require("express"); const app = express(); const PORT = 10000; app.use(express.json({ limit: "50mb" })); app.use("/api", require("./controllers/auth")); app.listen(PORT, function (err) { if (err) console.log("Error in server setup"); console.log("Server listening on Port", PORT); });
auth.js
const express = require("express"); const server = require("./server"); const router = express.Router(); router.post("/server", server); module.exports = router;
server.js
const server = async (req, res) => { console.log(req.body); return res.json({ status: "success" }); }; module.exports = server;
Main.java
public class Main { public static void main(String[] args) throws Exception { String url = "http://127.0.0.1:10000/api/server"; String json = "{\"request\": \"requesting\"}"; URL obj = new URL(url); HttpURLConnection con = (HttpURLConnection) obj.openConnection(); con.setRequestMethod("POST"); con.setRequestProperty("Content-Type", "application/json"); con.setDoOutput(true); DataOutputStream wr = new DataOutputStream(con.getOutputStream()); wr.writeBytes(json); wr.flush(); wr.close(); int responseCode = con.getResponseCode(); System.out.println("res code"); System.out.println("Response Code: " + responseCode); BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream())); String inputLine; StringBuffer response = new StringBuffer(); while ((inputLine = in.readLine()) != null) { response.append(inputLine); } in.close(); System.out.println("res string"); System.out.println(response.toString()); } }
内容的提问来源于stack exchange,提问作者seriously
相关产品推荐
相关产品推荐

