繁体   English   中英

java.net.ConnectException:连接被拒绝超时

[英]java.net.ConnectException: Connection refused timeout

我看到了很多“java.net.ConnectException:连接被拒绝”的问题,但没有一个是指这个错误的超时。 我的问题是我必须连接到在某些情况下被阻止的服务器(由另一个软件连接到同一端口)。 因此,我正在循环进行一些最大重试以尝试连接:

我当前的代码(当然,取决于我的软件的很多配置,但工作正常):

    public TCPConnector(TCPDefinition tcpDefinition) throws IAException {
    ivTcpDefinition = tcpDefinition;
     // Initialize the socket
    boolean retry = false;
    int counter = 1;
    do {
        try {
            ivSocket = new Socket();
            ivSocket.connect(new InetSocketAddress(tcpDefinition.getHostname(), tcpDefinition.getPort()), tcpDefinition.getConnectTimeOut());
            ivSocket.setSoTimeout(tcpDefinition.getAckTimeOut());
            retry = false;
        }
        catch (UnknownHostException uhe) {
            throw new IAException(null, new StringBuffer("Can't find host: ").append(tcpDefinition.getHostname()).toString(), uhe);
        }
        catch (SocketException see) {
            StringBuilder sb = new StringBuilder("Connection refused to host ").append(tcpDefinition.getHostname()).
            append(" port ").append(tcpDefinition.getPort()).append(". Connection Attempt Nr. ").append(counter);
            logger.error(sb.toString(), see);
            retry = true;
            if (counter++ > tcpDefinition.getConnectRetries())
                throw new IAException(null, sb.toString(), see);
            else
                logger.error("will retry to connect");
        }
        catch (IOException ioe) {
            StringBuilder sb = new StringBuilder("I/O error while connecting to host ").append(tcpDefinition.getHostname()).
            append(" port ").append(tcpDefinition.getPort()).append(". Connection Attempt Nr. ").append(counter);
            logger.error(sb.toString(), ioe);
            retry = true;
            if (counter++ > tcpDefinition.getConnectRetries())
                throw new IAException(null, sb.toString(), ioe);
            else
                logger.error("will retry to connect");
        }
    }
    while (retry);

}

嗯,问题是这样的:

  • 在 Windows 上,每秒都会抛出 SocketException,而不是 IOException,而我已经为ivSocket.connect配置了 5000 毫秒的超时
  • 在 Linux 上,这是每毫秒抛出一次!!

视窗:

2019-12-05 12:40:47,609 错误 DefaultQuartzScheduler_Worker-1 TCPConnector - 连接拒绝托管本地主机端口 13002。连接尝试编号。 1 java.net.ConnectException: 连接被拒绝:在 java.net.PlainSocketImpl.socketConnect(Native Method) 连接

2019-12-05 12:40:48,703 错误 DefaultQuartzScheduler_Worker-1 TCPConnector - 连接拒绝托管本地主机端口 13002。连接尝试编号。 2 java.net.ConnectException:连接被拒绝:连接

Linux:

2019-12-05 12:45:47,609 错误 DefaultQuartzScheduler_Worker-1 TCPConnector - 连接拒绝托管本地主机端口 13002。连接尝试编号。 1 java.net.ConnectException: 连接被拒绝:在 java.net.PlainSocketImpl.socketConnect(Native Method) 连接

2019-12-05 12:45:47,610 错误 DefaultQuartzScheduler_Worker-1 TCPConnector - 连接拒绝托管本地主机端口 13002。连接尝试编号。 2 java.net.ConnectException:连接被拒绝:连接

为什么超时没有执行? 嗯,这不完全正确。 如果我在 Windows 上配置了小于 1 秒的超时,则执行超时。 500 毫秒:

2019-12-05 11:47:07,375 错误 DefaultQuartzScheduler_Worker-1 TCPConnector - 连接到主机本地主机端口 13002 时出现 I/O 错误。连接尝试编号。 1 java.net.SocketTimeoutException: 在 java.net.PlainSocketImpl.socketConnect(Native Method) 连接超时

2019-12-05 11:47:07,875 错误 DefaultQuartzScheduler_Worker-1 TCPConnector - 连接到主机本地主机端口 13002 时出现 I/O 错误。连接尝试编号。 2 java.net.SocketTimeoutException: 在 java.net.PlainSocketImpl.socketConnect(Native Method) 连接超时

是否可以配置“连接拒绝”超时?

没有“连接拒绝超时”之类的东西。

当服务器看到连接请求,但没有服务侦听请求指向的 IP + 端口上的连接时,就会发生“连接被拒绝”。 然后服务器“拒绝”连接。 这通常会立即发生,因此不会触发超时。

当某些东西阻止连接请求到达服务器1, 2时,就会发生“连接超时”(通常)。 所以客户端会等待来自服务器的响应,然后重新发送/等待几次。 最终分配给建立连接的时间将到期......并且连接超时。

如您所见,这些是不同的场景。 并且它们以不同的方式报告回 Java 客户端。

因此,您没有超时的原因是“连接被拒绝”响应返回的速度足够快,不会超过您配置的超时。

这也可以解释为什么将连接超时设置得小可能会改变行为。 操作系统允许 Java 设置的超时粒度也可能存在问题。

为了进一步研究这一点,我认为我们需要一个最小的可重复示例。 例如,我们需要看看您是如何实现管理服务器套接字和接受服务器端连接的代码的。


1 - 阻塞可能在服务器的回复数据包上。
2 - 这种事情有多种可能的原因。 最有可能的原因是防火墙在某处阻止了流量、网络路由问题或在错误的网络上使用了私有 IP 地址。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM