Java Socket 无法使用 NoRouteToHostException 而不是

问题

当使用 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)




翻过高山走不出你
浏览 366回答 3
3回答

杨魅力

0.0.0.0是一个特殊地址,是特殊0.0.0.0/8范围的一部分,表示“当前网络”或“未指定”。您无法连接到它,因为它未定义为目的地。这就是为什么你得到一个NoRouteToHostException- 地址根本不可路由。如果您尝试运行ping 0.0.0.0或类似的命令,您将遇到类似的失败。ConnectionRefused当远程机器实际拒绝连接时发生,这通常表明远程机器没有侦听套接字或位于防火墙后面。

摇曳的蔷薇

我肯定会在两台机器上安装 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 向你展示了什么。

桃花长相依

我内联了您提供的代码并在 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.202Exception 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
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java