嘿,所有。我有一个使用ServerSocket和Socket类以java编写的服务器。如何处理Java中的Socket断开连接?
我希望能够检测并处理断开连接,然后根据需要重新连接新客户端。
什么是正确的程序来检测客户端断开,关闭套接字,然后接受新的客户端?
嘿,所有。我有一个使用ServerSocket和Socket类以java编写的服务器。如何处理Java中的Socket断开连接?
我希望能够检测并处理断开连接,然后根据需要重新连接新客户端。
什么是正确的程序来检测客户端断开,关闭套接字,然后接受新的客户端?
大概你正在从套接字中读取数据,可能是在输入数据流上使用了一个包装器,比如BufferedReader。在这种情况下,当相应的读取操作返回-1(对于raw read()调用)或null(对于readLine()调用)时,您可以检测到流结束。
某些操作在关闭套接字上执行时会导致SocketException,您还需要适当处理。
检测另一端的唯一安全方法是定期发送心跳信号,并根据缺少心跳信号将另一端设置为超时。
或者您可以设置超时时间 – Pyrolistical 2009-01-28 17:41:49
我有一个线程查看每个连接,查看自上次数据包被读取以来已经过了多长时间。 (心跳或其他) 它已经太长了,我关闭了连接。 – 2009-01-29 07:19:33
只是我还是没有人注意到JavaDoc声明了ServerSocket api下的方法,它允许我们根据serversocket的关闭状态来获取布尔值?
你可以循环每隔几秒钟,以检查它的状态:
if(!serverSocket.isClosed()){
// whatever you want to do if the serverSocket is connected
}else{
// treat a disconnected serverSocket
}
编辑:只是重新阅读您的问题,似乎是您所需要的服务器,只是不断地寻找连接,如果客户端断开连接时,它应该能够重新检测客户端何时尝试重新连接。应该不是只是你的解决方案呢?
有一个服务器正在监听,一旦它拿起客户端连接,它应该将它传递给工作线程对象并启动它以异步操作。然后服务器可以循环回听新的连接。如果客户端断开连接,则启动的线程会死机,重新连接时会再次启动新线程以处理新连接。
Jenkov提供了一个很好的例子。
其中,“关闭套接字”表示*您*关闭了套接字,而不是对等关闭连接。当遇到EOS时,除提及的那些以外的所有readXXX()方法都抛出EOFException。 – EJP 2013-08-17 10:17:41