代码之家  ›  专栏  ›  技术社区  ›  dpb

简单的开放式插座很少悬挂

  •  3
  • dpb  · 技术社区  · 15 年前

    我有一段相当简单的代码挂在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);
    

    由于这种情况在生产中很少发生,所以很难缩小问题的范围。我目前正在检测代码,以便在发生这种情况时,我们产品的下一个版本将获得更多信息,但我想我会问,是否有人以前只见过简单的绑定/连接/断开连接/关闭挂起?

    谢谢

    2 回复  |  直到 15 年前
        1
  •  3
  •   Darron    15 年前

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

        2
  •  2
  •   Joe    15 年前

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