所以我在制作一个非常简单的服务器/客户端复杂使用java。到目前为止,我已经设法弄清楚如果客户端退出会发生什么,因为服务器在侦听来自客户端的任何输入时接收null。
BUT -如果客户端连接并且服务器因任何原因退出会发生什么…服务器应该等待来自客户机的输入,但是客户机如何知道服务器不再侦听呢?对我来说,客户端对服务器的调用只是进入空白…什么也没发生…
我能做些什么来发现服务器何时宕机吗?暂停,打乒乓球什么的?
正如你所看到的,我在这方面很陌生,我只是好奇。自从我在大学学习计算机科学以来,这个问题一直困扰着我。
提前感谢。dr_xemacs .
(我假设您正在使用阻塞服务器套接字和套接字,而不是非阻塞套接字)与服务端类似,从关闭连接的流中读取数据将返回null。
但是,如果您不希望依赖于此,或者担心与服务器的连接可能以某种方式持续存在,您也可以使用超时(看看这个!)它会在时间到达时抛出SocketTimeoutException,并且为了跟踪服务器是否启动,创建一个ping/数据包以确保服务器仍然启动并运行。
编辑:我做了一个快速搜索,这可能对你有用!看一看!客户端如何知道服务器不再监听?
如果客户端不尝试在某种程度上与服务交互,它将不知道。
假设客户端已经发送了一个请求,几个不同的场景。
-
如果服务不再在指定端口上侦听,客户端通常会收到"连接被拒绝";例外。
-
如果服务仍在运行(在某种意义上),但它没有正常工作,那么来自客户端的连接尝试可能会超时。
-
如果服务的主机关闭,客户端可能会超时。
-
如果存在网络连接或防火墙问题,客户端可能会获得超时或其他异常。
我能做些什么来发现当服务器下降?暂停,打乒乓球什么的?
您尝试连接并发送请求。如果失败或超时,则意味着服务已关闭。如果您自己设计和实现服务,则可以包含一个特殊的"健康检查"。请求客户"ping";上。但另一方面,接收和响应这些请求将消耗网络和服务器资源。它可能会影响扩展客户端数量的能力,例如,如果每个客户端每N秒ping一次服务。
但是客户端通常不需要来知道服务是up还是down。它通常只关心服务在发送实际请求时的响应。最简单的处理方法就是发送请求并处理结果。(客户端代码必须处理所有可能的结果,无论如何,当做一个真正的请求。在最后一次健康检查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){}
}