![](/img/trans.png)
[英]Socket server and socket client java - detecting server from client located on different computers
[英]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.