繁体   English   中英

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

[英]Server detecting a client losing connection from the socket

在Java中,如果我通过套接字将客户端连接到服务器,而客户端有一个异常导致崩溃,则服务器是否可以通过任何方式检测到套接字连接丢失。

我认为一种方法是对客户端进行某种心跳轮询,但是有没有更简单/更简便的方法?

有几种方法,具体取决于您认为是“崩溃”的原因。

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

如果客户端陷入无限循环,则连接将保持打开状态。 检测到此问题的唯一方法是将某种“心跳”并入您的协议中。

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

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

* Windows和Linux的默认时间均为2小时; 您可以在整个系统范围内更改,但不能更改每个套接字(无论如何在Java下)

TCP套接字还是这样做,而Java将其公开给开发人员。 请参见Socket类中的setKeepAlive() / getKeepAlive() 如果在一定时间内没有从客户端向服务器发送TCP消息,套接字将关闭,并且服务器可以删除会话信息,因为它仍然具有端点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM