为了账号安全,请及时绑定邮箱和手机立即绑定

Java Socket 无法使用 NoRouteToHostException 而不是

Java Socket 无法使用 NoRouteToHostException 而不是

翻过高山走不出你 2022-06-15 09:44:36
问题当使用 java 的 socket 类打开一个套接字IP: 0.0.0.0和Port: 37845(只是一个随机关闭的端口)时,套接字连接失败,机器 1java.net.NoRouteToHostException上有一个Exception 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)我正在使用这个测试代码:import java.net.InetSocketAddress;import java.net.Socket;import java.net.SocketAddress;public class Test { public static void main(String[] args) throws Exception {  Socket socket;  // create a socket with a timeout  SocketAddress socketAddress = new InetSocketAddress("0.0.0.0", 37845);  // create a socket  socket = new Socket();  // this method will block no more than timeout ms.  int timeoutInMs = 10 * 1000; // 10 seconds  socket.connect(socketAddress, timeoutInMs);  System.err.println("SUCCESS"); }}预期的什么,我实际上期待的是一个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)
查看完整描述

3 回答

?
杨魅力

TA贡献1811条经验 获得超6个赞

0.0.0.0是一个特殊地址,是特殊0.0.0.0/8范围的一部分,表示“当前网络”或“未指定”。您无法连接到它,因为它未定义为目的地。

这就是为什么你得到一个NoRouteToHostException- 地址根本不可路由。如果您尝试运行ping 0.0.0.0或类似的命令,您将遇到类似的失败。

ConnectionRefused当远程机器实际拒绝连接时发生,这通常表明远程机器没有侦听套接字或位于防火墙后面。


查看完整回答
反对 回复 2022-06-15
?
摇曳的蔷薇

TA贡献1793条经验 获得超6个赞

我肯定会在两台机器上安装 Wireshark,并比较所有场景。

具体来说:

https://superuser.com/questions/720851/connection-refused-vs-no-route-to-host

“连接被拒绝”表示目标机器主动拒绝连接......可能是以下情况之一:

  • 端口上没有任何东西在监听

  • 防火墙阻止了与 REJECT 的连接

ICMP 消息“no route to host”表示 ARP 无法找到目标主机的第 2 层地址。通常,这意味着具有该 IP 地址的主机未在线或未响应。

当然,这引出了一个问题,为什么 Python 以一种方式运行,而 Java 以不同的方式运行……在同一台机器上。

再一次 - 我鼓励你看看 Wireshark。特别是看 1) 三向 TCP 握手,以及 2) 在它之前的 ARP 调用。


PS:正如麦芽上面所说:

0.0.0.0 ...地址根本不可路由。

在 Windows 上,您可能会收到WSAEADDRNOTAVAIL - 远程地址不是有效地址

这就引出了一个问题,为什么你会得到“ConnectionRefused”。

再说一次 - 我很好奇 Wireshark 向你展示了什么。


查看完整回答
反对 回复 2022-06-15
?
桃花长相依

TA贡献1860条经验 获得超8个赞

我内联了您提供的代码并在 Windows 10 系统上运行它,我得到了正确的异常


import java.net.InetSocketAddress;

import java.net.Socket;


public class Main {


    public static void main(String[] args) throws Exception {


        new Socket().connect(new InetSocketAddress("0.0.0.0", 37845), 10_0000);

    }

}

甲骨文 JDK 8.0.202


Exception in thread "main" java.net.ConnectException: Connection refused: connect

    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)

    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85)

    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.PlainSocketImpl.connect(PlainSocketImpl.java:172)

    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)

    at java.net.Socket.connect(Socket.java:589)

    at Main.main(Main.java:8)


Process finished with exit code 1


查看完整回答
反对 回复 2022-06-15
  • 3 回答
  • 0 关注
  • 365 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号