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

问题描述

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

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

我可以做些什么来查明服务器何时出现故障吗?暂停,乒乓之类的?

正如您肯定看到的,我对此很陌生,我只是很好奇。自从我在大学学习计算机科学以来,这对我来说就是一个难题。

提前致谢。 dr_xemacs。

解决方法

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

然而,如果你不想依赖这个或者害怕与服务器的连接可能会以某种方式持续存在,你也可以使用超时(检查 this out!)已启动,为了跟踪服务器是否启动,请创建 ping/数据包以确保服务器仍在运行。

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

,

客户端如何知道服务器不再监听?

如果客户端不尝试在某个级别与服务交互,它不会知道。

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

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

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

  • 如果服务的主机关闭,客户端可能会超时。

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

我可以做些什么来查明服务器何时出现故障吗?暂停,乒乓之类的?

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

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

底线:不要在客户端检查可用性,除非应用程序(即最终用户)真的需要知道

,

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

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){}
}