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

时间:2011-05-14 17:28:30

标签: java sockets connection

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

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

2 个答案:

答案 0 :(得分:3)

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

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

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

如果重新启动客户端主机或网络连接中断,除非:

,否则服务器可能不会注意到
  • 该协议具有上述“心跳”机制,具有某种超时或
  • 通过调用{{1}}在套接字上启用TCP keepalive - 这会指示操作系统定期*发送数据包以检查连接的远程端是否处于活动状态,如果不是则关闭连接

* Windows和Linux都默认为2小时;您可以更改此系统范围,但不能更改每个插槽(在Java下,无论如何)

答案 1 :(得分:0)

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