簡體   English   中英

如何將多個客戶端連接到多個服務器並根據某些事件從服務器發送警報?

[英]How to connect multiple clients to multiple servers and send alerts from servers based on certain events?

背景

我目前有多個服務器遠程連接到我,以運行許多不同的命令/腳本來獲取有關服務器和/或服務器上運行的應用程序的信息。

我想自動運行命令/腳本(或轉換為C#/。NET的腳本中包含的代碼),並讓服務器向運行在多個工作站上的客戶端(基本上是Windows窗體)發送警報/通知/消息,但需要一些指導。

作為參考,我在創建Windows Services方面經驗有限,但是對能夠在服務器上創建它們以處理命令/腳本自動化感到很有信心,我認為這將是處理命令/腳本的最佳方法。服務器上的自動化(因為命令/腳本將需要一直運行或以設置的間隔運行)。

我如何將多個服務器連接到多個客戶端,以便當服務器上發生命令/腳本甚至事件時,服務器將警報/通知/消息發送給客戶端?

例如,如果服務器上的應用程序具有內置命令,可以運行該命令來確定應用程序的狀態(啟動,關閉,邊緣等),我希望客戶端上的Windows窗體能夠接收警報當命令在運行時返回“向下”或“ limbo”時,可能來自服務器(大概是Windows服務)。 警報將顯示在Windows窗體上,該窗體基本上設置為客戶端可以連接到的服務器的儀表板。

更好的結果是客戶端將作為后台應用程序運行,並且通知的外觀類似於Microsoft Outlook在收到新電子郵件時顯示通知的方式(盡管這些通知可能需要關閉用戶交互而不是像Outlook通知那樣淡出) )。

我還希望客戶端使用其中包含服務器連接信息的配置文件,以便可以快速更改正在使用的服務器,以添加新服務器或停用現有服務器。

研究(到目前為止)

我已經閱讀了WCF和雙工合同,以及如何在Windows Services中托管WCF。 根據我的閱讀,這似乎很有希望。 但是,我不太確定如何進行設置,以便客戶端可以連接到多台服務器上的WCF服務。

我關心WCF的一件事是,在所有WCF示例(實現計算器類型的服務)中,我都看到客戶端必須啟動與服務器的通信才能通過回調接收消息。 。 在計算器服務示例中,客戶端將數字發送到服務,結果在回調中提供。 我還看到了一個異步示例,但是在該示例中,客戶端啟動了一個長期運行的請求,並且在完成處理后,回調函數返回了單個響應。

並且,這樣我就很清楚WCF中的綁定,就可以使用配置文件為多個服務器創建和使用綁定,而不必使用SvcUtil.exe生成代碼,對嗎? 我問的原因是因為要配置的服務器可能會針對不同的用戶進行更改,因此客戶端在連接服務時需要靈活。

我現在才開始研究Socket,但是我對它們還不夠熟悉,無法確定這是否是實現我的目標的更好選擇。

摘要

我只是在尋找指導,因此,如果您可以引導我去一些可以幫助我實現目標的資源,我將不勝感激。 我已經進行了廣泛的搜索,但是大部分搜索都不適用於我的方案,它僅限於單個服務器/客戶端交互,或者僅限於具有多個客戶端的單個服務器。

由於我不確定該朝哪個方向前進,因此盡管我已在以下Microsoft文章中實現了這些示例,但我沒有任何代碼示例: Windows Communication Foundation-入門教程

所以你想建立一個系統

  1. 多個服務器,它們在運行它們的計算機上執行命令
  2. 多個客戶端,這些客戶端將接收在服務器上執行的命令的狀態或來自服務器的此類信息

這是我的建議

  1. 服務器可以實現為Windows服務。 您將可以使用服務控制台或scm輕松地管理它們。 簽出此鏈接以創建簡單的C#服務如何在C#中編寫和使用Windows服務?
    此外,您可以將服務設置為以常規用戶帳戶的身份以具有不同權限級別的內置服務用戶身份運行。
  2. 我沒有使用WCF,但是通常客戶端會連接到服務器。 這是一個非常普通的模型,因此所有樣本都是這樣。 從服務器發起連接並不是什么大問題(至少在套接字程序中),而只是一個不好的模型。 您必須問自己,如果沒有客戶端連接到服務器,它們如何將狀態轉發給最終用戶。 您必須清楚地考慮交流模型。 我建議建立一個中央消息存儲庫。 它可以是共享文件系統上的文件或數據庫,也可以是可以充當數據存儲庫的任何此類實體。 這樣,所有服務器都可以傳遞消息,而無需關心客戶端是否連接。 您可以使用套接字來實現您想要的操作。 檢查來自MSDN異步套接字服務器示例,以了解如何進行操作。
  3. 在C#中,使客戶端在后台運行並僅具有通知區域圖標也很容易。 您可以為此使用NotifyIcon類 此CodeProject文章(無格式系統托盤應用程序)演示了其用法。 要顯示Outlook風格的通知,您可以參考以下文章: 如何使用c#從Windows應用程序(而非Web)上的系統托盤創建窗體彈出窗口 不僅要看已接受的答案,還要看其他答案; 有很多有用的鏈接。

到目前為止,我們已經有Windows服務通過套接字進行通信,將消息存儲在中央存儲庫中,並且能夠通過Toast Style Pops處理多個客戶端以進行客戶端通知。

您需要更豐富的客戶端GUI,以便最終用戶可以對服務器發送的消息進行操作。 您可以在客戶端啟動時連接的客戶端app.config中維護服務器列表。 您應該為用戶提供一個GUI,以管理所有服務器及其連接。

但是,通過構建這樣的客戶端服務器模型,您可以有效地在系統中構建安全漏洞。 您應該實施良好的授權機制。 查看以下帖子: 在WinForms中對用戶進行身份驗證(與ASP.Net無關)

編輯:您還可以實現服務器以將其作為服務實現時接受“自定義命令”。 這樣,將通過使用ServiceController傳遞命令來標准化客戶端服務器通信。 這篇文章可能會有所幫助: 如何從.NET代碼向.NET Windows服務發送自定義命令?
在這里不要對“命令”術語感到困惑。 ServiceController向服務發出標准命令以啟動,停止,暫停,繼續和重新啟動服務。 這些是在右鍵單擊services.msc管理單元中的服務時在上下文菜單上看到的相同項目。 服務可以響應自定義命令的方式相同。 在您的情況下,定制命令可能是執行流程的請求。
請注意,我描述的一些機制適用於Intranet設置,而其他機制在Intranet和Internet上都可以很好地擴展

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM