我有一个 Java 服务器和客户端,这是一个简单的服务器,当客户端与之通信时会打印一条消息。当客户端和服务器在同一台机器上时,它工作得很好。当我将客户端放在另一台机器上时,出现以下异常:
java.net.ConnectException: Connection refused
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:579)
at java.net.Socket.connect(Socket.java:528)
at java.net.Socket.<init>(Socket.java:425)
at java.net.Socket.<init>(Socket.java:208)
at DateClient.main(DateClient.java:16)
我尝试在另一台机器(不是客户端)上运行服务器,它工作正常。因此,机器存在某些问题,不允许客户端连接到该端口。我尝试从客户端 ping 服务器,它能够到达服务器。我关闭了防火墙sudo /etc/init.d/iptables stop
,但客户端仍然无法连接到服务器。任何帮助,将不胜感激!
答案1
“连接被拒绝”意味着:TCP 连接确实到达了服务器(或者被客户端和服务器之间的防火墙明确阻止),假设后者不成立 - 有 3 种可能: 1. 客户端的 IP连接到的不是服务器进程正在侦听的 IP 或接口,因此操作系统拒绝连接。 2. 服务器程序明确拒绝连接,因为它在内部过滤请求。 3. 服务器上有另一个防火墙进程拒绝请求。
首先,验证服务器进程正在侦听有效的 IP/端口:
sudo netstat -apn | grep "server process name"
您应该得到如下响应(例如 smbd - Samba 的“服务器进程名称”):
user@host:~# sudo netstat -apn | grep smbd
tcp 0 0 192.168.10.1:139 0.0.0.0:* LISTEN 7721/smbd
请注意“192.168.10.1:139” - 您将希望查看客户端连接到的特定 IP,或 0.0.0.0:139(这意味着所有接口、所有本地 IP)。如果您看到 127.0.0.1 或客户端无法访问的 IP,那么您的问题就在那里。
其次,验证您的服务器程序不会在内部阻止来自某些主机的传入连接(因为您没有提供有关服务器是什么的信息,所以我必须将其留给您)
最后,如果您确定服务器进程正在侦听客户端可访问的有效接口,并且服务器程序不会过滤传入连接,那么请回到基础知识:
1- 验证请求是否到达服务器,其中 eth0 和 tcp 端口将更改以适合您的环境:
sudo tcpdump -i eth0 -n -v tcp port 139
您将看到 2 路流量:
user@host:~# sudo tcpdump -i eth1 -n -v tcp port 139
tcpdump: listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes
12:27:45.339982 IP (tos 0x0, ttl 128, id 12153, offset 0, flags [DF], proto TCP (6), length 52)
192.168.10.10.24411 > 192.168.10.1.139: Flags [S], (output cut)
请注意 192.168.10.10.24411(客户端)与 ">" 192.168.10.1.139(服务器)使用 TCP SYN (-> [S]) 数据包标记 [S]
TCP 转储显示的下一个数据包可能会有 [R.] 标志(重置 - 连接被拒绝)
因此,如果您看到 SYN,则 RST - 服务器肯定会阻止连接,也许在调试模式下运行您的服务器程序以显示发生了什么。
如果您没有看到 SYN 数据包(并且您已经仔细检查了为 tcpdump 指定的 tcp 端口和接口),那么您可能遇到了防火墙,或者客户端和服务器之间可能存在路由问题。
祝你好运。
答案2
当您尝试连接的端口上没有侦听服务时,通常会发生此异常。以下任何事情都可能发生:
- 您还没有启动您的服务器。
- 您的服务器没有等待接受连接。
- 您正在尝试连接到错误的端口号。