简单的开放式插座很少挂

时间:2010-01-22 20:28:09

标签: java sockets network-programming

我有一段相当简单的代码,挂在java中。这种情况很少发生。也许是每1000次执行一次的顺序。将它循环运行到设备似乎无法重现问题。

long timeout = 10000;
long endTime = System.currentTimeMillis() + timeout + 5000;
Socket pingSocket = null;
String host = "host";
String port = "22";

do {

    try {
        pingSocket = new Socket();
        pingSocket.bind(null);
        pingSocket.connect(new InetSocketAddress(host, port), 5000);
        if (pingSocket.isConnected()) {
            pingSocket.close();
            return true;
        }
        pingSocket.close();
    }
    catch (UnknownHostException e) {
        throw e;
    }
    catch (IOException e) {
        // All other errors are subclassed from IOException, and i want
        // to ignore till after my spin period.
    }

    try {
        Thread.sleep(SPIN_SLEEP_DELAY);
    }
    catch (InterruptedException e) {
        return false;
    }

} while (System.currentTimeMillis() <= endTime);

由于它在生产中很少发生,因此很难缩小导致问题的原因。我目前正在检测代码,以便我们的产品的下一个版本在发生这种情况时会有更多的信息,但我想我会问是否有人看到过一个简单的bind / connect / isConnected / close挂起之前?< / p>

谢谢!

2 个答案:

答案 0 :(得分:3)

您是否在挂起期间生成了Java线程转储?这将告诉您代码中挂起的位置。

答案 1 :(得分:2)

我已经读过如果套接字无法连接,那么调用代码仍然必须在继续之前关闭它(现在找不到引用)。否则,资源仍会消耗,未来打开套接字的尝试可能会挂起。

因此,将套接字移近finally块,以确保套接字即使无法连接也会关闭。