Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.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

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 ObjectInputStream';s readObject()在客户端套接字连接终止后冻结_Java_Sockets_Freeze - Fatal编程技术网

Java ObjectInputStream';s readObject()在客户端套接字连接终止后冻结

Java ObjectInputStream';s readObject()在客户端套接字连接终止后冻结,java,sockets,freeze,Java,Sockets,Freeze,我有以下套接字服务器的代码从连接的套接字读取流 try { ObjectInputStream in = new ObjectInputStream(client.getInputStream()); int count = 10; while(count>0) { String msg = in.readObject().toString(); //Stucks here if this client is lost. Sy

我有以下套接字服务器的代码从连接的套接字读取流

try
{
    ObjectInputStream in = new ObjectInputStream(client.getInputStream());
    int count = 10;
    while(count>0)
    {
        String msg = in.readObject().toString(); //Stucks here if this client is lost.
        System.out.println("Client Says : "+msg);
        count--;
    }
    in.close();
    client.close();
}
catch(Exception ex)
{
    ex.printStackTrace();
}
我有一个客户端程序,与这个服务器连接,每秒发送一些字符串10次,服务器从套接字读取10次并打印消息,但如果在这段时间内我杀死客户端程序,服务器会在这段时间内冻结,而不是抛出任何异常或任何东西


如何检测这种冻结状态?并使此循环无限迭代并打印客户端发送的任何内容,直到连接处于活动和稳定状态?

问题在于套接字的服务器端无法知道客户端连接已关闭,因为客户端代码终止时未调用套接字客户端的.close(),因此从不发送TCP FIN信号

解决这个问题的一种可能方法是创建一个新的观察线程,它只是定期检查套接字,看看它是否仍然处于活动状态。这种方法的问题在于,套接字上的isConnected()无法工作,原因与上述相同,因此检查连接的唯一实际方法是尝试对其进行写入。但是,这可能会导致将随机垃圾发送到可能正在侦听的客户端

其他选择是实现某种类型的保持活动协议,客户机应该同意(即,每隔一段时间发送保持活动位,以便观察者可以查找)。您还可以转向java.nio方法,我相信它在处理这些条件方面做得更好


此线程很旧,但提供了更多详细信息:

服务器在引发任何异常之前实际上正在等待超时。您应该查看api中减少超时值的方法@邪恶:那么改变/减少超时值听起来不是个好主意。如果连接以任何其他方式丢失(而不是我杀死客户端),比如从网络断开连接,它会重新建立连接并在客户端返回网络时从相同的状态继续吗?