Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中,客户端如何知道服务器已退出?_Java_Server_Timeout_Client - Fatal编程技术网

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

在java中,客户端如何知道服务器已退出?,java,server,timeout,client,Java,Server,Timeout,Client,因此,我正在使用java构建一个非常简单的服务器/客户端复合体。到目前为止,我已经设法弄清楚了如果客户端退出会发生什么,因为服务器在侦听来自客户端的任何输入时会收到null 但是-如果客户端已连接,而服务器出于任何原因退出,会发生什么情况。。。服务器应该等待来自客户机的输入,但是客户机怎么知道服务器不再侦听呢?对我来说,客户端对服务器的调用只是进入了无效状态。。。什么都没发生 我能做些什么来查明服务器什么时候停机吗?暂停,打乒乓球什么的 正如你所看到的,我对这一点很陌生,我只是好奇。自从我在大学

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

但是-如果客户端已连接,而服务器出于任何原因退出,会发生什么情况。。。服务器应该等待来自客户机的输入,但是客户机怎么知道服务器不再侦听呢?对我来说,客户端对服务器的调用只是进入了无效状态。。。什么都没发生

我能做些什么来查明服务器什么时候停机吗?暂停,打乒乓球什么的

正如你所看到的,我对这一点很陌生,我只是好奇。自从我在大学里学习计算机科学以来,这对我来说一直是个谜

提前谢谢。dr_xemacs.

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

但是,如果您不想依赖于此或担心与服务器的连接会以某种方式持续,您也可以使用超时(签出!),这将在时间到时抛出SocketTimeoutException,为了跟踪服务器是否已启动,请创建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){}
}
客户端如何知道服务器不再侦听

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

假设客户端已发送请求,则会出现一些不同的场景

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

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

  • 如果服务的主机关闭,客户端将获得超时

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

我能做些什么来查明服务器什么时候停机吗?暂停,打乒乓球什么的

您尝试连接并发送请求。如果出现故障或超时,则表示服务已关闭。如果您自己设计和实现该服务,您可以包括一个特殊的“healthcheck”请求,供客户“ping”使用。但另一方面,在接收和响应这些请求时,将消耗网络和服务器资源。它会影响您扩大客户端数量的能力,例如,如果每个客户端每N秒ping一次服务

但是客户机通常不需要知道服务是否正常。它通常只关心服务在发送真实请求时的响应。最简单的处理方法就是发送请求并处理结果。(客户端代码在执行实际请求时必须处理所有可能的结果。在最后一次healthcheck ping和客户端发送实际请求之间,服务可能会停止等。)

一句话:除非应用程序(即最终用户)真的需要知道,否则不要费心检查客户端的可用性