服务器检测到客户端从套接字丢失连接

在Java中,如果我通过套接字连接到客户端到服务器并且客户端有exception导致它崩溃,那么服务器是否有任何方法可以检测到套接字连接丢失。

我假设一种方法会对客户端进行某种心跳轮询,但是有更简单/更简单的方法吗?

有几种方法,取决于你认为是“崩溃”。

如果客户端进程终止,客户端操作系统将关闭套接字。 服务器可以通过执行read()来检测这一点, read()将返回-1(EOF)或引发SocketException (“连接重置”)。

如果客户端进入无限循环,连接将保持打开状态; 检测这种情况的唯一方法是在您的协议中加入某种“心跳”。

如果重新启动客户端主机或网络连接中断,则服务器可能不会注意到,除非:

  • 协议有一个“心跳”机制,如上所述,有某种超时,或
  • 通过调用socket.setKeepAlive(true)在套接字上启用TCP keepalive – 这指示操作系统定期*发送数据包以检查连接的远程端是否处于活动状态,如果没有则关闭连接

* Windows和Linux默认为2小时; 你可以改变这个系统范围但不是每个套接字(在Java下,无论如何)

TCP套接字无论如何都会这样做,Java将它暴露给开发人员。 请参阅Socket类中的setKeepAlive() / getKeepAlive() 。 如果TCP消息未在一段时间内从客户端发送到服务器,则套接字将关闭,并且服务器可以删除会话信息,因为它仍然具有其端点。