【问题标题】:Java socket timeout does not applyJava 套接字超时不适用
【发布时间】:2014-12-07 22:35:40
【问题描述】:

我在 java 中有这个使用超时的套接字实现:

        try {
            socket = new Socket();
            socket.connect(new InetSocketAddress(ip, port), 5000);

        } catch (SocketException e2) {
            System.out.println("Something wrong with the socket: " + e2);
        }

ip和端口已关闭,无法建立连接。 但是这里的超时不起作用。它不会等待 5 秒然后返回错误。

此代码位于构造函数中,并从可运行类调用。这可能是原因吗?

【问题讨论】:

    标签: java sockets timeout


    【解决方案1】:

    连接超时是connect() 将阻塞的最大时间。如果出现立即连接拒绝或其他错误,您将立即得到它。在这种情况下,目标端口没有在侦听,因此您将立即获得ConnectException: connection refused。如果错误发生得更早,则不必等待超时。超时实际上是针对根本没有响应的地方。等待一个错误没有任何意义。

    【讨论】:

    • 好的,那我该怎么做呢,它会等待一段最长时间,然后返回错误,不管端口是否关闭?可能会在等待此超时时打开?
    • 你不能。尝试循环,带睡眠。
    【解决方案2】:

    Socket socket = new Socket();

    //这限制了允许建立连接的时间

    //如果在指定的超时时间内没有收到连接结果,则超时。

    socket.connect(new InetSocketAddress(host, port), timeout);

    // 连接成功后停止请求等待响应。

    socket.setSoTimeout(超时);

    【讨论】:

    • 不回答问题。
    • socket.connect 中的超时意味着如果在一定时间内无法连接,连接将超时。
    • setSoTimeout 指定在没有收到响应时断开连接的时间。
    • 只是重复你自己对你的答案没有任何帮助,它仍然不能回答问题。他知道这一点,而且他已经在这样做了。这里的问题是为什么他没有超时。
    • 因为他在5秒前就得到了连接结果。所以没有发生超时。
    猜你喜欢
    • 2013-05-23
    • 2014-10-09
    • 2018-07-16
    • 2013-04-24
    • 2011-12-18
    • 2013-02-28
    • 1970-01-01
    • 2013-09-08
    • 1970-01-01
    相关资源
    最近更新 更多