C# 持续检查服务器的状态
我有基于C#的客户机-服务器体系结构。客户端将连接到服务器并交换数据 我需要不断检查服务器状态,如果服务器关闭(从网络中删除或关闭),客户端需要指示 如果我在客户机程序中使用C# 持续检查服务器的状态,c#,client-server,C#,Client Server,我有基于C#的客户机-服务器体系结构。客户端将连接到服务器并交换数据 我需要不断检查服务器状态,如果服务器关闭(从网络中删除或关闭),客户端需要指示 如果我在客户机程序中使用Ping实用程序,在性能方面,哪种方法是最好的,即通过单独的线程或后台类进行监视 public static bool GetPingResponse(string IpAddress, int timeout = 3000) { var ping = new Ping(); var reply = ping
Ping
实用程序,在性能方面,哪种方法是最好的,即通过单独的线程或后台类进行监视
public static bool GetPingResponse(string IpAddress, int timeout = 3000)
{
var ping = new Ping();
var reply = ping.Send(IpAddress, timeout);
if (reply.Status == IPStatus.Success)
{
return true;
}
else
{
return false;
}
}
在性能和资源消耗方面,还有比Ping更好的选择吗?您需要确保您的呼叫代表“可用”。例如,如果它是http服务器,发出ping请求只是表示可以通过网络访问它。web服务器可能已关闭,但网络堆栈已启动。如果是这样的话,可以调用更多的堆栈,比如http。如果有后端数据库,则可以通过数据库服务器进行调用。这完全取决于你对“可用”的定义。如果关键是说应用程序可用,那么您应该研究一个调用,该调用将在整个堆栈中执行路径 它还取决于服务器的可用性以及客户端和服务器之间通过防火墙打开的内容 Ping使用一些站点选择通过防火墙阻止的ICMP。如果这是开放的,这是一个便宜的电话,很少的开销 如果它被阻止了,并且是一个web服务器,例如通过http,那么您可以在web服务器上有一个便宜的端点,您可以通过C#中的http客户端调用该端点 您可能需要在后台线程上使用计时器进行轮询。检查手术室 最后,您可以研究一个监控解决方案——有许多解决方案可以监控服务器的多个方面。如果您这样做,客户机可以简单地查询监控解决方案,这可能会更好,因为您不会有n个客户机轮询您的服务器——只有一个监控堆栈 另一方面,最后一段代码可以简化为:
return reply.Status == IPStatus.Success;
如何连接到服务器?您正在使用tcp吗?是的,仅限tcp。。但我需要检查服务器的通电状态。不仅是tcp连接状态。可能值得考虑的是,您是否真的需要知道服务器硬件已通电,或者是否需要知道服务器上是否正在运行特定的服务。即使您不断收到服务器的响应,这并不意味着服务器能够在您实际向其发送请求时做出响应——它可能在最后一次“ping”之后失败,直到它实际发送响应为止。无论如何,您都需要编写代码来应对这种情况。因此,任何ping行为都只是开销,无法解决任何情况(您仍然可以决定这样做以向用户提供提示,但正如我所说的,您还需要编写其他代码)