问题
当用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