客户端套接字连接被终止后,ObjectInputStream的readObject()冻结

时间:2012-06-08 14:10:27

标签: java sockets freeze

我有跟随Socket服务器的代码,它从连接的Socket读取流。

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次并打印消息,但如果在中间我杀了客户端程序,服务器在两者之​​间冻结,而不是抛出任何异常或任何东西。

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

1 个答案:

答案 0 :(得分:2)

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

解决此问题的一种可能方法是创建一个新的Watcher线程,该线程只是定期检查套接字以查看它是否仍处于活动状态。这种方法的问题是Socket上的isConnected()不能用于上述相同的原因,因此检查连接的唯一真正方法是尝试写入它。但是,这可能会导致随机垃圾被发送到潜在侦听客户端。

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

此主题已旧,但提供了更多详细信息:http://www.velocityreviews.com/forums/t541628-sockets-checking-for-dropped-connections-and-close.html