如何将多个客户端连接到多个服务器,并根据特定事件从服务器发送警报

本文关键字:服务器 事件 客户端 连接 | 更新日期: 2023-09-27 18:22:04

背景

我有多个服务器,我当前远程连接到这些服务器,以运行许多不同的命令/脚本,从而获取有关服务器和/或服务器上运行的应用程序的信息。

我想自动运行命令/脚本(或转换为C#/.NET的脚本中包含的代码),并让服务器向在多个工作站上运行的客户端(基本上是Windows窗体)发送警报/通知/消息,但需要一些指导。

作为参考,我创建Windows服务的经验有限,但我对能够在服务器上创建它们以处理命令/脚本自动化非常有信心,我认为这将是在服务器上处理命令/剧本自动化的最佳方式(因为命令/脚本需要一直运行或以设定的间隔运行)。

问题

如何将多个服务器连接到多个客户端,以便在服务器上发生命令/脚本甚至事件时,服务器向客户端发送警报/通知/消息?

例如,如果服务器上的应用程序有一个内置命令,可以运行该命令来确定应用程序的状态(向上、向下、不稳定等),我希望客户端上的Windows窗体在运行该命令时返回"向下"或"不稳定"时从服务器接收警报,可能来自Windows服务。警报将显示在Windows窗体上,该窗体将基本上设置为客户端可以连接的服务器的仪表板

更好的结果是,客户端作为后台应用程序运行,通知的显示方式与Microsoft Outlook在收到新电子邮件时显示通知的方式类似(尽管这些通知可能需要用户交互才能关闭,而不是像Outlook通知那样淡出)。

我还希望客户端使用一个配置文件,其中包含服务器的连接信息,以便可以快速更改正在使用的服务器添加新服务器或停用现有服务器。

研究(迄今为止)

我读过关于WCF和双工合约的文章,以及如何在Windows服务中托管WCF。据我所知,这似乎很有希望。然而,我不太确定如何设置它,以便客户端可以连接到多台服务器上的WCF服务。

我关心WCF的一件事是,在所有WCF示例(实现计算器类型服务)中,我看到客户端必须启动与服务器的通信,才能通过回调接收消息。在计算器服务示例中,客户端向服务发送数字,并在回调中提供结果。我还看到了一个异步示例,但在该示例中,客户端启动了一个长时间运行的请求,回调在完成处理时返回了一个响应。

而且,为了让我清楚WCF中的绑定,可以使用配置文件为多个服务器创建和使用绑定,而不必使用SvcUtil.exe来生成代码,对吗?我之所以这么问,是因为将针对不同用户配置的服务器可能会发生变化,因此客户端在连接到服务时需要灵活。

我刚刚开始研究Sockets,但我对它们还不够熟悉,不知道这是否是实现我目标的更好选择。

摘要

我只是在寻求指导,所以如果你能帮助我找到一些有助于我实现目标的资源,我将不胜感激。我已经进行了广泛的搜索,但我的大部分搜索要么不适用于我的场景,要么仅限于单个服务器/客户端交互,要么仅限具有多个客户端的单个服务器。

由于我不确定该朝哪个方向发展,我没有任何代码示例,尽管我已经在下面的Microsoft文章中实现了这些示例:Windows Communication Foundation-Getting Started Tutorial

如何将多个客户端连接到多个服务器,并根据特定事件从服务器发送警报

所以你想建立一个系统

  1. 在运行的计算机上执行命令的多个服务器
  2. 多个客户端,它们将接收在服务器上执行的命令的状态或来自服务器的此类信息

这将是我的建议

  1. 服务器可以实现为windows服务。您将能够使用服务控制台或scm以这种方式轻松地管理它们。查看此链接以创建一个简单的C#服务如何在C#中编写和使用Windows服务
    此外,除了常规用户帐户外,您还可以将服务设置为以具有不同权限级别的内置服务用户身份运行
  2. 我没有使用WCF,但通常客户端连接到服务器;这是一个非常常见的模型,因此所有的样本都是这样的。从服务器启动连接并不是什么大事(至少在套接字程序中是这样),只是一个糟糕的模型。你必须问问自己,如果没有客户端连接到你的服务器,他们如何将状态中继到最终用户。你必须清楚地思考沟通模式。我建议建立一个信息的中央存储库。它可以是共享文件系统或数据库上的文件,也可以是任何可以充当数据存储库的实体。这样,所有服务器都可以在那里传递消息,而不必关心客户端是否已连接。你可以使用套接字来实现你想要做的事情。查看MSDN中的异步套接字服务器示例,了解如何做到这一点
  3. 在c#中,让客户端在后台运行并只拥有一个通知区域图标也很容易。您可以为此使用NotifyIcon类。这篇CodeProject文章(Formless System Tray Application)演示了它的用法。要显示la outlook风格的通知,您可以参考以下帖子:如何使用c#从windows应用程序(而非web)上的系统托盘创建表单弹出窗口。不仅要看被接受的答案,还要看其他答案;里面有很多有用的链接

到目前为止,我们有windows服务通过套接字进行对话,将消息存储在中央存储库中,并能够通过toast风格的弹出窗口处理多个客户端,以进行客户端通知。

您需要一个更加丰富的客户端GUI,这样最终用户就可以对服务器发送的消息执行操作。您可以在app.config中为客户端在启动时连接的客户端维护服务器列表。您应该为用户提供一个GUI来管理所有服务器及其连接。

Lat,但同样重要的是,通过构建这样一个客户端-服务器模型,您实际上是在系统中构建了一个安全漏洞。您应该实现一个良好的授权机制。签出以下帖子:在WinForms中验证用户(与ASP.Net无关)

编辑:您还可以将服务器实现为在将其作为服务实现时接受"自定义命令"。这样,您的客户端-服务器通信将通过使用ServiceController传递命令而标准化。这篇文章可能会有所帮助:如何从.NET代码向.NET窗口服务发送自定义命令
不要混淆这里的"命令"术语。ServiceController向服务发出标准命令,用于启动、停止、暂停、恢复和重新启动服务。当您右键单击services.msc管理单元中的服务时,这些项目与您在上下文菜单上看到的项目相同。服务可以以同样的方式响应自定义命令。在您的情况下,自定义命令可能是执行进程的请求
请注意,我所描述的一些机制是针对内部网设置的,而其他机制在内部网和互联网上都可以很好地扩展