我有跟随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次并打印消息,但如果在中间我杀了客户端程序,服务器在两者之间冻结,而不是抛出任何异常或任何东西。
如何检测此冻结情况?并使这个循环无限迭代并打印客户端发送的任何内容,直到连接处于活动状态且稳定?
答案 0 :(得分:2)
问题是套接字的服务器端无法知道客户端连接已关闭,因为客户端代码终止而没有在套接字的客户端调用.close(),因此从不发送TCP FIN信号。
解决此问题的一种可能方法是创建一个新的Watcher线程,该线程只是定期检查套接字以查看它是否仍处于活动状态。这种方法的问题是Socket上的isConnected()不能用于上述相同的原因,因此检查连接的唯一真正方法是尝试写入它。但是,这可能会导致随机垃圾被发送到潜在侦听客户端。
其他选项是实现客户端应该同意的某种类型的保持活动协议(即,每隔一段时间发送保持活动的位,以便观察者有需要寻找的东西)。你也可以转向java.nio方法,我相信在处理这些条件方面做得更好。
此主题已旧,但提供了更多详细信息:http://www.velocityreviews.com/forums/t541628-sockets-checking-for-dropped-connections-and-close.html。