2015-09-14 183 views
3

我正在構建一個c#/ wpf項目。 它的結構是這樣的:如何將更新從服務器發送到客戶端?

  • 這將是一個虛擬機(或我家的電腦),這將是服務器端的控制檯應用程序。
  • WPF應用程序,這將是客戶端應用程序。

現在我的問題是這樣的 - 我希望服務器能夠發送更改到客戶端。例如,如果我對客戶端ABC進行了更改,我希望服務器知道如何在客戶端計算機上調用服務。 問題是,我不知道服務器將如何調用客戶端。

的情況下,一個小例子,我沒有解釋得很好: 服務器是計算機1上,有兩個客戶端,計算機上的2和3 客戶端2的豐田轎車和客戶端3有寶馬汽車。 計算機1上的服務器想要告訴客戶端2它有一輛新車,復仇者。

如何跟蹤和呼叫服務的客戶呢? 我以爲他們節省IP地址(調用來自CMD IPCONFIG)在DB的 - 但是,這不是基於WI-FI /網絡它們所連接到的?

感謝您的幫助!

+0

如果我錯了,肯定有人可以糾正我,但客戶應該詢問是否有更新。這不完全是服務器的工作。 –

+0

你使用什麼框架爲服務器/客戶端連接? WCF?你有沒有考慮過使用類似Azure Event Hub的東西? –

回答

5

你可以嘗試實施SignalR。這是一個偉大的庫,它使用Web套接字將數據推送到客戶端。

編輯:

SignalR可以幫助您通過允許您設置集線器上的控制檯應用程序(服務器)WPF應用程序(客戶端)解決您的問題可以連接到。當客戶端啓動時,您將向指定的Hub註冊它們。當服務器上的內容發生變化時,您可以從服務器集線器推送到客戶端。客戶將收到來自服務器的信息,並允許您按照您認爲合適的方式處理。

的一些代碼粗糙小樣:

namepsace Server{} 
    public class YourHub : Hub { 
     public void SomeHubMethod(string userName) { 
      //clientMethodToCall is a method in the WPF application that 
      //will be called. Client needs to be registered to hub first. 
      Clients.User(userName).clientMethodToCall("This is a test."); 

      //One issue you may face is mapping client connections. 
      //There are a couple different ways/methodologies to do this. 
      //Just figure what will work best for you. 
     } 
    } 
} 

namespace Client{ 
    public class HubService{   

     public IHubProxy CreateHubProxy(){ 
      var hubConnection = new HubConnection("http://serverAddress:serverPort/"); 
      IHubProxy yourHubProxy = hubConnection.CreateHubProxy("YourHub"); 
      return yourHubProxy; 
     } 
    } 

} 

然後在您的WPF窗口:

var hubService = new HubService(); 
var yourHubProxy = hubService.CreateHubProxy(); 
yourHubProxy.Start().Wait(); 
yourHubProxy.On("clientMethodToCall",() => DoSometingWithServerData()); 
+0

如果你解釋了SignalR如何滿足這種建築需求,這將是一個更有用的答案 –

2

您需要創建某種爲客戶訂購模式的服務器來處理髮布 - 訂閱頻道(請參閱http://www.enterpriseintegrationpatterns.com/patterns/messaging/PublishSubscribeChannel.html)。基本架構如下:

  1. 客戶端向消息通道發送一個請求,將自己註冊爲某種消息/事件等的訂閱者。
  2. 服務器將消息發送到被遞送給訂戶到該消息的信道。

有許多方法來處理這個問題。如果您不想在此重新發明輪子,則可以使用一些Azure服務(如事件中心或主題)。你也可以讓你的服務器應用程序跟蹤所有這些東西(更新IP地址,更新訂閱興趣,確保消息不會多次發送;注意消息持久性[確保消息傳遞,即使客戶端在消息被創建時離線])。

1

一般來說,無論您選擇哪種解決方案都會遇到常見問題 - 客戶端隱藏在防火牆之後,並且具有動態IP地址。這使得服務器推送到客戶端變得困難(我聽說有技術聲稱要克服這個問題,但沒有看到任何實際操作)。

實際上,客戶端會話和服務器偵聽和響應。但是,您可以使用此方法來模擬推送; 1.輪詢(客戶端定期詢問信息) 2.長輪詢(客戶端詢問信息,服務器持有請求直到信息到達或發生超時) 3.套接字(客戶端請求服務器連接用於雙向通信一段時間)。

瞭解這些條款後,您的下一個選擇是編寫您自己的或使用第三方服務(azure,amazon等)爲您提供消息。我個人喜歡長輪詢,因爲它很容易實現。在我的應用程序中,我有以下設置。

  • 在Azure上與監聽消息的Web API服務器和端點請求
  • 來檢查每100ms新郵件數據庫的服務器代碼中的簡單循環。
  • 調用API處理響應的客戶端。

如上所述,有很多方法可以做到這一點。在你的具體情況下,一種方法如下。

  1. 客戶端A調用服務器API來監聽消息
  2. 服務器保存到通話,在數據庫等待新的消息進入
  3. 客戶端B調用服務器API發佈新的消息
  4. 服務器保存信息數據庫從第2步
  5. Server實例看到新的消息
  6. 服務器返回信息給客戶端A.

此外,消息不必存儲在數據庫中 - 這取決於您的需求。

相關問題