Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 简单的开放式插座很少悬挂_Java_Sockets_Network Programming - Fatal编程技术网

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

Java 简单的开放式插座很少悬挂,java,sockets,network-programming,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 =

我有一段相当简单的代码挂在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);
long timeout=10000;
long-endTime=System.currentTimeMillis()+超时+5000;
套接字pingSocket=null;
字符串host=“host”;
字符串端口=“22”;
做{
试一试{
pingSocket=新套接字();
pingSocket.bind(null);
pingSocket.connect(新的InetSocketAddress(主机、端口),5000);
if(pingSocket.isConnected()){
pingSocket.close();
返回true;
}
pingSocket.close();
}
捕获(未知后异常e){
投掷e;
}
捕获(IOE异常){
//所有其他错误都是IOException的子类,我希望
//直到我的旋转周期结束后才开始忽略。
}
试一试{
线程睡眠(自旋睡眠延迟);
}
捕捉(中断异常e){
返回false;
}

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

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


因此,请将套接字移到靠近finally块的位置,以确保即使无法连接,套接字也已关闭。

套接字没有读/写功能?在数百种情况下,简单的读/写循环可能会无限期地阻塞。我认为第一件也是最简单的事情是查看服务器的ssh日志,看看是否存在明显的问题在您挂起的过程中继续进行。@否:否。这就是代码的范围。这只是一个简单的套接字连接,以确保在我们继续进行之前,另一端有东西。@Duck:我当然可以从那一端接近它。我最关心的是,为什么java中挂起了这个愚蠢的东西。我们只是简单地使用它在尝试运行ssh之前使用“isAlive”,以防有人不知道。好主意Darron——问题是这种情况最多每两周发生一次。因此,它更像是“发生了吗,客户有没有告诉我们,我们能在他们杀死它之前到达它,等等”。因此,这是一个典型的客户生产环境:-(我将接受这一个。这似乎是唯一真正的解决方案是在它发生时抓住它。谢谢@Joe,我认为这是一个非常可能的解决方案,尽管我不能很容易地确认它。如果我可以接受两个答案,我会接受。我将在进一步研究后将其添加到代码中。