Linux 服务器拒绝 Java 客户端连接

Linux 服务器拒绝 Java 客户端连接

我有一个 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

当您尝试连接的端口上没有侦听服务时,通常会发生此异常。以下任何事情都可能发生:

  1. 您还没有启动您的服务器。
  2. 您的服务器没有等待接受连接。
  3. 您正在尝试连接到错误的端口号。

相关内容