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

时间:2019-12-05 12:12:03

标签: java sockets

我看到了很多“ 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上,这是每毫秒抛出的!!

Windows:

  

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

     

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

Linux:

  

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

     

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

为什么不执行超时?好吧,这并不完全正确。如果我在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(本机方法)

     

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

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

1 个答案:

答案 0 :(得分:2)

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

当服务器看到连接请求时,会发生

“拒绝连接”的情况,但是对于请求所指向的IP +端口上的连接没有服务监听。然后,服务器“拒绝”连接。这通常是立即发生的,因此不会触发超时。

“连接超时”(通常)是由于某些原因阻止了连接请求到达服务器 1、2 。因此,客户端将等待服务器的响应,然后重新发送/等待几次。最终分配给建立连接的时间将到期...并且连接超时。

您会看到这些是不同的情况。而且它们以不同的方式报告回Java客户端。

所以没有超时的原因是“连接被拒绝”响应很快返回,因此没有超出配置的超时。

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

要对此进行进一步调查,我认为我们需要一个最小的可复制示例。例如,我们需要查看您如何实现管理服务器套接字并接受服务器端连接的代码。


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