1

我有以下 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 次并打印消息,但是如果在这之间我杀死客户端程序,服务器就会冻结之间而不是抛出任何异常或任何东西。

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

4

1 回答 1

2

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

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

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

该线程很旧,但提供了更多详细信息:http ://www.velocityreviews.com/forums/t541628-sockets-checking-for-dropped-connections-and-close.html 。

于 2012-06-08T17:47:18.687 回答