在進行 Socket 編程時,java.net.ConnectException: Connection refused 是最常見的異常之一。本文直擊痛點,記錄一次典型排查過程,幫助開發者快速定位問題,避免彎路。
java.net.ConnectException: Connection refused: connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(Unknown Source)
at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
直接原因:客户端嘗試連接的 IP 和端口上,沒有服務端程序正在監聽。即「沒有開啟對應的服務器」。
常見場景:
ps -ef | grep java 或 Windows 任務管理器。netstat -an | grep 端口號(Linux)或 netstat -ano | findstr 端口號(Windows),狀態應為 LISTEN。telnet localhost 端口號,若連不上則確為服務端問題。new ServerSocket(port) 默認綁 0.0.0.0(全網卡),若顯式指定 InetAddress.getByName("127.0.0.1") 則僅本機可訪問。ConnectException 給出友好提示(如「服務暫不可用,請稍後重試」),避免堆棧暴露給用戶。InetSocketAddress,便於運維核對。核心提示:Connection refused 幾乎總意味著「對端沒人聽」。優先檢查服務端進程與端口,90% 情況下問題即在此處。