服务器检测到客户端从套接字丢失连接
在Java中,如果我通过套接字连接到客户端到服务器并且客户端有exception导致它崩溃,那么服务器是否有任何方法可以检测到套接字连接丢失。
我假设一种方法会对客户端进行某种心跳轮询,但是有更简单/更简单的方法吗?
有几种方法,取决于你认为是“崩溃”。
如果客户端进程终止,客户端操作系统将关闭套接字。 服务器可以通过执行read()
来检测这一点, read()
将返回-1(EOF)或引发SocketException
(“连接重置”)。
如果客户端进入无限循环,连接将保持打开状态; 检测这种情况的唯一方法是在您的协议中加入某种“心跳”。
如果重新启动客户端主机或网络连接中断,则服务器可能不会注意到,除非:
- 协议有一个“心跳”机制,如上所述,有某种超时,或
- 通过调用
socket.setKeepAlive(true)
在套接字上启用TCP keepalive – 这指示操作系统定期*发送数据包以检查连接的远程端是否处于活动状态,如果没有则关闭连接
* Windows和Linux默认为2小时; 你可以改变这个系统范围但不是每个套接字(在Java下,无论如何)
TCP套接字无论如何都会这样做,Java将它暴露给开发人员。 请参阅Socket
类中的setKeepAlive()
/ getKeepAlive()
。 如果TCP消息未在一段时间内从客户端发送到服务器,则套接字将关闭,并且服务器可以删除会话信息,因为它仍然具有其端点。