在 java 中,客户端如何知道服务器已退出?

In java, how will a client know that the server has quit?

所以我正在使用 java 制作一个非常简单的 server/client 复合体。到目前为止,我已经设法弄清楚如果客户端退出会发生什么,因为服务器在侦听来自客户端的任何输入时都会收到 null。

但是 - 如果客户端已连接并且服务器出于任何原因退出会发生什么......服务器应该等待来自客户端的输入,但客户端如何知道服务器不再监听?对我来说,客户端对服务器的调用只是无效的……没有任何反应……

我可以做些什么来查明服务器何时宕机吗?超时,ping/pong 什么的?

正如您所见,我对此很陌生,我只是好奇。自从我在大学学习计算机科学以来,这一直是我的困惑。

提前致谢。 dr_xemacs.

(我假设您使用的是阻塞服务器套接字和套接字,而不是非阻塞套接字) 与服务器类似,从关闭连接的流中读取将 return null.

但是,如果您不想依赖这个或者害怕与服务器的连接可能会以某种方式持续存在,您也可以使用超时(检查 this out!),这将在以下情况下抛出 SocketTimeoutException时间到了,为了跟踪服务器是否启动,创建一个 ping/packet 以确保服务器仍然启动并且 运行.

编辑:我进行了快速搜索, 可能对您有用!快来看看吧!

您的服务器可能 运行 在某个端口上,因此您可以在客户端添加健康检查并更新具有状态的全局标志,让客户端了解其可用性:-

Socket socket = null;
try
{
    socket = new Socket(host, port);
    return true;
}
catch (Exception e)
{
    return false;
}
finally
{
    if(socket != null)
        try 
        {
             socket.close();
        }
        catch(Exception e){}
}

How can the client know that the server is not listening anymore?

如果客户端不尝试在某种程度上与服务交互,它不会知道。

假设客户端发送了一个请求,几个不同的场景。

  • 如果服务不再侦听指定端口,客户端通常会收到“连接被拒绝”异常。

  • 如果服务仍然运行(在某种意义上)但不能正常工作,那么来自客户端的连接尝试很可能会超时。

  • 如果服务的主机宕机,客户端会超时。

  • 如果存在网络连接或防火墙问题,客户端可能会出现超时或其他一些异常。

Can I do something to find out when the server goes down? Time-out, ping/pong or something?

您尝试连接并发送请求。如果失败或超时,则意味着服务已关闭。如果您自己设计和实施服务,您可以包括一个特殊的“健康检查”请求,供客户端“ping”。但不利的一面是,接收和响应这些请求会消耗网络和服务器资源。它会影响您扩展客户端数量的能力,例如,如果每个客户端每 N 秒 ping 一次服务。

但是客户端通常不需要知道服务是启动还是关闭。它通常只关心服务在发送真实请求时做出响应。最简单的处理方法是发送请求并处理结果。 (在执行真实请求时,客户端代码无论如何都必须处理所有可能的结果。服务可能会在最后一次健康检查 ping 和客户端发送真实请求之间发生故障等。)

底线:除非应用程序(即最终用户)确实需要知道

,否则不要费心检查客户端的可用性