java - Windows平台上socket连接异常为什么会有差异

标签 java sockets exception socket-timeout-exception connectexception

在 Windows 平台上,我运行这段代码:

代码:

Socket socket = new Socket();
    try {
        socket.connect(new InetSocketAddress("127.0.0.1", 8080), 500);
    } catch (Exception e) {
        e.printStackTrace();
    }
    socket = new Socket();
    socket.connect(new InetSocketAddress("127.0.0.1", 8080), 1100);

127.0.0.1:8080 无法访问,但我得到了不同的异常:

java.net.SocketTimeoutException: connect timed out
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:206)
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 com.hash.test.TestRxJava.main(TestRxJava.java:14)
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:206)
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 com.hash.test.TestRxJava.main(TestRxJava.java:19)

可以看到,一个是SocketTimeoutException,一个是ConnectException

我很困惑为什么异常是不同的,这个异常导致我正在使用的框架出现一些问题(Spring Ribbon,相关问题是:ribbon issue)

希望有人能解释一下:

  1. 为什么异常不同

  2. 我什么时候会得到“SocketTimeoutException:连接超时”,我什么时候会得到另一个?

非常感谢


@乔纳森·罗森

我翻了一下代码,结果一样:

Socket socket = new Socket();
    try {
        socket.connect(new InetSocketAddress("127.0.0.1", 8080), 1100);
    } catch (Exception e) {
        e.printStackTrace();
    }
    socket = new Socket();
    socket.connect(new InetSocketAddress("127.0.0.1", 8080), 500);

结果:

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:206)
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 com.transsnet.afbet.factsCenter.sdk.SDKTest.main(SDKTest.java:726)
Exception in thread "main" java.net.SocketTimeoutException: connect timed out
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:206)
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 com.transsnet.afbet.factsCenter.sdk.SDKTest.main(SDKTest.java:731)

最佳答案

因为您指定了不同的连接超时。 500 毫秒对于实际的连接超时来说太短了,但是,由于您指定了它,并且在该超时期限内连接没有成功,所以您得到的是连接超时,这是可以预料的。当您指定一个更现实的(只是)超时 1100 毫秒时,您遇到了潜在的问题,即连接拒绝,因为没有任何东西在目标 IP:port 上监听。

请注意,这段代码中存在套接字泄漏。

关于java - Windows平台上socket连接异常为什么会有差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47991986/

相关文章:

java - 二进制搜索在 Java 中给出 Index Out of Bound 异常

java - 使 JTextArea 可序列化

c++ - 从构造函数跨 DLL 边界抛出异常

java - onItemSelectedListner 实现抽象方法

java - 为什么在 System.Logger 中使用 log(DEBUG, msg) 而不是 debug(msg)?

Java Swing 图形故障?

c# - Tcp Listener 套接字仅用于建立连接或处理所有传入数据?

c - 如何使用 c 套接字 api 发送文件。

java - 如何在 Spring Data JPA 中干净地捕获 DAO 服务层异常

c++ - 包装 C++ 类 API 以供 C 使用时如何将异常转换为错误和错误消息?