C# 如何从服务器向客户端发送更新?
我正在建立一个c#/wpf项目。 它的架构是:C# 如何从服务器向客户端发送更新?,c#,wpf,client-server,C#,Wpf,Client Server,我正在建立一个c#/wpf项目。 它的架构是: 一个控制台应用程序,它将位于服务器端的虚拟机(或我的家庭计算机)上 将成为客户端应用程序的wpf应用程序 现在我的问题是——我希望服务器能够向客户端发送更改。例如,如果我更改了客户端ABC,我希望服务器知道如何调用客户端计算机上的服务。 问题是,我不知道服务器将如何调用客户端 如果我解释得不好,举个小例子: 服务器在计算机1上,并且在计算机2和3上有两个客户端。 客户2有一辆丰田汽车,客户3有一辆宝马汽车。 计算机1上的服务器想告诉客户端2它有
- 一个控制台应用程序,它将位于服务器端的虚拟机(或我的家庭计算机)上
- 将成为客户端应用程序的wpf应用程序
谢谢你的帮助 您可以尝试实现。它是一个很棒的库,使用web套接字将数据推送到客户端 编辑: SignalR允许您在WPF应用程序(客户端)可以连接的控制台应用程序(服务器)上设置集线器,从而帮助您解决问题。当客户端启动时,您将向指定的中心注册它们。当服务器上发生更改时,您可以从服务器中心推送到客户端。客户机将从服务器接收信息,并允许您根据需要进行处理。 一些代码的粗略模型:
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());
您需要为客户端到服务器创建某种订阅模型,以处理发布-订阅通道(请参阅)。基本架构如下:
有很多方法可以解决这个问题。如果您不想在这里重新发明轮子,您可以使用一些Azure服务(如事件中心或主题)。您还可以让服务器应用程序跟踪所有这些内容(更新IP地址、更新订阅兴趣、确保消息不会被发送多次;注意消息的持久性[确保消息在创建消息时即使客户端脱机也能被发送]).听起来你想跟踪用户,但在桌面应用程序中,在或damienbod.wordpress.com/2013/11/20/signar-a-complete-wpf-client-using-mvvm/的意义上,一般来说,无论你选择什么解决方案,都会遇到一个常见的问题——客户端隐藏在防火墙后面,并且具有动态IP地址。这使得服务器很难推送到客户机上(我听说有技术声称可以克服这一点,但还没有看到任何实际应用) 实际上,客户机对话,服务器监听并响应。但是,您可以使用此方法模拟推送; 1.轮询(客户端定期询问信息) 2.长轮询(客户端请求信息,服务器保留请求,直到信息到达或超时) 3.套接字(客户端请求一段时间内用于双向通信的服务器连接) 了解这些术语后,您的下一个选择是编写自己的或使用第三方服务(azure、amazon、other)为您传递消息。我个人喜欢长轮询,因为它易于实现。在我的应用程序中,我有以下设置
- Azure上的web API服务器,具有和侦听消息请求的端点
- 服务器代码中的一个简单循环,每100毫秒检查一次数据库中的新消息
- 调用API并处理响应的客户端李>
此外,消息不必存储在数据库中——它只取决于您的需要 如果我错了,肯定会有人纠正我,但客户应该询问是否有更新。这不完全是服务器的工作。您使用什么框架进行服务器/客户端连接?WCF?您是否考虑过使用类似Azure事件中心的东西?如果您解释Signal如何满足这种体系结构需求,这将是一个更有用的答案