java socket 连接失败_Java Socket无法使用NoRouteToHostException(而不是ConnectionRejected)连接到“0.0.0.0”...

问题

当用java的socket类打开一个到IP: 0.0.0.0和Port: 37845(只是一个随机关闭的端口)的套接字时,套接字连接失败,机器1上的java.net.NoRouteToHostExceptionException in thread "main" java.net.NoRouteToHostException: No route to host (Host unreachable)

at java.net.PlainSocketImpl.socketConnect(Native Method)

at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)

at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:204)

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 Test.main(Test.java:26)

我正在使用这个测试代码:

^{pr2}$

期望

实际上,我期待的是一个java.net.ConnectException : Connection refused (Connection refused),这也是我用另一台Cent OS机器得到的,我们把它叫做Machine2:Exception in thread "main" 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:204)

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 Test.main(Test.java:26)

设置

机器1:[qa@jenkins-staging ~]$ cat /etc/centos-release

CentOS Linux release 7.6.1810 (Core)

[qa@jenkins-staging ~]$ java -version

openjdk version "1.8.0_191"

OpenJDK Runtime Environment (build 1.8.0_191-b12)

OpenJDK 64-Bit Server VM (build 25.191-b12, mixed mode)

[qa@jenkins-staging ~]$ uname -a

Linux jenkins-staging.fancydomain 3.10.0-514.el7.x86_64 #1 SMP Tue Nov 22 16:42:41 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

机器2:[qa@localhost ~]$ cat /etc/centos-release

CentOS Linux release 7.6.1810 (Core)

[qa@localhost ~]$ java -version

openjdk version "1.8.0_191"

OpenJDK Runtime Environment (build 1.8.0_191-b12)

OpenJDK 64-Bit Server VM (build 25.191-b12, mixed mode)

[qa@localhost ~]$ uname -a

Linux localhost.localdomain 3.10.0-957.1.3.el7.x86_64 #1 SMP Thu Nov 29 14:49:43 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

所以看起来唯一的区别就是内核版本。在

我尝试过的其他事情:我用python尝试了“相同”的代码,在那里我总是得到一个

ConnectionRefused(在机器1+机器2上)import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.connect(("0.0.0.0", 37845))

在Machine1上ping 0.0.0也同样有效,并解析为127.0.0.1

将源代码中的0.0.0.0替换为127.0.0.1将解析

出现问题,并引发ConnectionRefused(应为)而不是{}

禁用Firewalld、禁用SELinux等

问题这是java错误吗?如果是这样,为什么它在机器2上工作

他们使用相同的jdk和相同的java版本?在

这是Linux内核的错误吗?如果是这样的话,为什么我打开它时它在使用Python

一个0.0.0.0的套接字而不是java?我会假设

系统调用是相同的。在

澄清

在上面的例子中,我使用了一个关闭的端口,只是为了演示。如果机器上有一个实际的监听端口,那么它将是ConnectionRefusedvsSUCCESS

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值