【问题标题】:Socket connection doesn't time out套接字连接不会超时
【发布时间】:2011-08-30 15:40:03
【问题描述】:

当客户端尝试连接到服务器时,我正在尝试设置超时,如果服务器关闭,连接将等待 10 秒,然后抛出超时异常。 在我的情况下,下面的代码无需等待就抛出 IOException,我真的不明白!

public boolean establishConnection()
{
    System.out.println ("Connecting to " +
            this.getServerHostname() + " au port " + this.getServerPort()+ " ...");

    try {

        SocketAddress sockaddr= new InetSocketAddress(_serverHostname, _serverPort);
        _echoSocket = new Socket();
        _echoSocket.connect(sockaddr,10000);
        return _echoSocket.isConnected();


    } catch (UnknownHostException e) {
        System.err.println("Unknown Host: " + this.getServerHostname());
        return false;
    } catch (SocketTimeoutException e) {
        System.err.println("Timeout");
        return false;
    } catch (IOException e) {
        System.err.println("IOException  : " + 
                this.getServerHostname() + ":" + this.getServerPort());
        return false;
    }
}

【问题讨论】:

  • 你得到的例外是......?

标签: java sockets timeout


【解决方案1】:

只有在您的连接请求未得到答复时,您才会获得超时。如果服务器立即拒绝它,或者如果服务器不存在,你会立即得到一个异常。

【讨论】:

  • 如果服务器不存在,socket的API有没有办法设置超时?或者我必须使用 Java 计时器
  • 我不明白:如果您的程序立即知道连接失败,您为什么要设置超时?但可以肯定的是,您可以调用Thread.sleep() 等待十秒钟——无需使用像Timer 这样复杂的任何东西。
【解决方案2】:

但这是您想要实现的目标吗?
如果您的意图是,如果服务器暂时关闭,请在 10 秒后重试,那么您的方法是错误的。
您应该尝试与服务器建立连接,如果由于服务器关闭而导致异常,您可以sleep 10 秒,然后再次尝试请求。
否则欧内斯特的答案是正确的

【讨论】:

    猜你喜欢
    • 2014-10-09
    • 2011-05-11
    • 1970-01-01
    • 2012-11-17
    • 2011-02-05
    • 2018-11-26
    • 2020-06-02
    • 2016-10-02
    相关资源
    最近更新 更多