You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

为何无法通过Socket连接127.0.0.1端口?遇java.net.ConnectException报错

Java Socket连接被拒绝(Connection refused)问题分析

你尝试用这段Java代码连接本地9876端口:

Socket socket = new Socket("127.0.0.1", 9876);

结果抛出了java.net.ConnectException: Connection refused (Connection refused)异常,而且已经确认当前没有程序占用这个端口,错误栈如下:

at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:589)
at java.net.Socket.connect(Socket.java:538)
at java.net.Socket.<init>(Socket.java:434)
at java.net.Socket.<init>(Socket.java:211)

咱来拆解一下问题的核心原因:

最常见的情况:没有对应服务端在监听端口

Socket是典型的客户端-服务端模型,你这边写的是客户端代码,发起连接请求,但如果9876端口上根本没有一个服务端程序在启动并监听这个端口,系统自然会返回“连接被拒绝”。你说端口没被占用,这反而印证了这点——如果有服务端在监听,端口会显示被占用的状态。

要解决的话,你得先启动一个绑定9876端口的服务端,比如这段基础代码:

ServerSocket serverSocket = new ServerSocket(9876);
Socket clientSocket = serverSocket.accept(); // 阻塞等待客户端连接

先运行服务端,再启动客户端,连接就能正常建立了。

其他可能的小坑

  • 端口处于TIME_WAIT状态:如果之前启动过服务端但异常退出,系统可能会把端口保留几分钟(TIME_WAIT状态),这时候工具查端口可能显示“未被占用”,但实际无法绑定。这种情况要么等几分钟,要么换个端口试试。
  • 端口号写错了:比如服务端实际用的是9875,你客户端写成9876了,这种低级失误也很容易犯,再核对一遍端口号准没错。

内容的提问来源于stack exchange,提问作者Giotto

火山引擎 最新活动