wpf 如何将更新从服务器发送到客户端?

4c8rllxm  于 2023-04-07  发布在  其他
关注(0)|答案(4)|浏览(192)

我正在构建一个c#/wpf项目。它的架构是这样的:

  • 一个控制台应用程序,将在虚拟机(或我的家庭计算机)上,将是服务器端。
  • 将作为客户端应用程序的wpf应用程序。

现在我的问题是-我希望服务器能够将更改发送到客户端。例如,如果我对客户端ABC进行了更改,我希望服务器知道如何调用客户端计算机上的服务。问题是,我不知道服务器将如何调用客户端。
举个小例子,以防我没有解释清楚:服务器在计算机1上,有两个客户端,分别在计算机2和3上。客户端2有一辆丰田汽车,客户端3有一辆宝马汽车。计算机1上的服务器想告诉客户端2它有一辆新车,Avenger。
我如何跟踪和调用客户端上的服务?我想在DB中保存他们的IP地址(从cmd调用ipconfig)-但这不是基于他们连接到的WI-FI/网络吗?
感谢您的任何帮助!

sg2wtvxw

sg2wtvxw1#

你可以试着实现SignalR,它是一个很棒的库,使用web套接字将数据推送到客户端。
编辑:
SignalR可以帮助您解决问题,允许您在控制台应用程序(服务器)上设置Hubs,WPF应用程序(客户端)可以连接到该Hubs。当客户端启动时,您将向指定的Hub注册它们。当服务器上发生更改时,您可以从服务器Hub推送到客户端。客户端将从服务器接收信息,并允许您根据需要处理它。
一些代码的粗略模型:

namespace 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());
c2e8gylq

c2e8gylq2#

您需要为服务器的客户端创建某种订阅模型,以处理发布-订阅通道(请参阅http://www.enterpriseintegrationpatterns.com/patterns/messaging/PublishSubscribeChannel.html)。基本架构如下:
1.客户端向消息传递通道发送请求,以将其自身注册为某种消息/事件等的订阅者。
1.服务器将消息发送到通道,以传递给该消息的订阅者。
有很多方法可以处理这个问题。如果你不想在这里重新发明轮子,你可以使用一些Azure服务(如Event hub或Topic)。你也可以让你的服务器应用程序跟踪所有这些事情(更新IP地址,更新订阅兴趣,确保消息不会被发送一次以上;注意消息的持久性[确保即使在创建消息时客户端离线也能传递消息])。

pvcm50d1

pvcm50d13#

一般来说,无论你选择什么解决方案,都有一个共同的问题--客户端隐藏在防火墙后面,并且有动态的IP地址。这使得服务器很难(我听说过一些技术声称可以克服这个问题,但还没有看到任何实际应用)将数据推送到客户端。
在现实中,客户端对话,服务器监听并响应。1.轮询(客户机周期性地请求信息)2.长轮询(客户机请求信息并且服务器保持该请求直到信息到达或者发生超时)3.套接字(客户机请求用于双向通信的服务器连接一段时间)。
了解了这些术语,你的下一个选择是编写自己的或使用第三方服务(azure,amazon,其他)来为你传递消息。我个人喜欢长轮询,因为它很容易实现。在我的应用程序中,我有以下设置。

  • Azure上具有侦听消息请求的端点的Web API服务器
  • 服务器代码中的一个简单循环,每100 ms检查数据库中的新消息。
  • 调用API的客户端,处理响应。

如上所述,有很多方法可以做到这一点。在您的特定情况下,一种方法如下所示。
1.客户端A调用服务器API监听消息
1.服务器保持呼叫,等待数据库中的新消息条目
1.客户端B调用服务器API发布新消息
1.服务器将消息保存到数据库
1.步骤2中的服务器示例看到新消息
1.服务器向客户端A返回消息。
此外,消息不必存储在数据库中-它只取决于您的需要。

xoshrz7s

xoshrz7s4#

听起来你想跟踪用户到https://www.simple-talk.com/dotnet/asp.net/tracking-online-users-with-signalr/,但在http://www.codeproject.com/Articles/804770/Implementing-SignalR-in-Desktop-Applications或www.example.com意义上的桌面应用程序中damienbod.wordpress.com/2013/11/20/signalr-a-complete-wpf-client-using-mvvm/。

相关问题