Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从服务器向客户端发送更新?_C#_Wpf_Client Server - Fatal编程技术网

C# 如何从服务器向客户端发送更新?

C# 如何从服务器向客户端发送更新?,c#,wpf,client-server,C#,Wpf,Client Server,我正在建立一个c#/wpf项目。 它的架构是: 一个控制台应用程序,它将位于服务器端的虚拟机(或我的家庭计算机)上 将成为客户端应用程序的wpf应用程序 现在我的问题是——我希望服务器能够向客户端发送更改。例如,如果我更改了客户端ABC,我希望服务器知道如何调用客户端计算机上的服务。 问题是,我不知道服务器将如何调用客户端 如果我解释得不好,举个小例子: 服务器在计算机1上,并且在计算机2和3上有两个客户端。 客户2有一辆丰田汽车,客户3有一辆宝马汽车。 计算机1上的服务器想告诉客户端2它有

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

  • 一个控制台应用程序,它将位于服务器端的虚拟机(或我的家庭计算机)上
  • 将成为客户端应用程序的wpf应用程序
现在我的问题是——我希望服务器能够向客户端发送更改。例如,如果我更改了客户端ABC,我希望服务器知道如何调用客户端计算机上的服务。 问题是,我不知道服务器将如何调用客户端

如果我解释得不好,举个小例子: 服务器在计算机1上,并且在计算机2和3上有两个客户端。 客户2有一辆丰田汽车,客户3有一辆宝马汽车。 计算机1上的服务器想告诉客户端2它有一辆新车,一辆复仇者

我如何跟踪和呼叫客户服务? 我想把他们的ip地址(通过cmd调用ipconfig)保存在DB中,但这不是基于他们所连接的WI-FI/网络吗


谢谢你的帮助

您可以尝试实现。它是一个很棒的库,使用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并处理响应的客户端
    如前所述,有很多方法可以做到这一点。在您的特殊情况下,一种方法如下

  • 客户端A调用服务器API来侦听消息
  • 服务器保留调用,等待数据库中的新消息条目
  • 客户端B调用服务器API发布新消息
  • 服务器将消息保存到数据库
  • 步骤2中的服务器实例看到新消息
  • 服务器将消息返回给客户端A

  • 此外,消息不必存储在数据库中——它只取决于您的需要

    如果我错了,肯定会有人纠正我,但客户应该询问是否有更新。这不完全是服务器的工作。您使用什么框架进行服务器/客户端连接?WCF?您是否考虑过使用类似Azure事件中心的东西?如果您解释Signal如何满足这种体系结构需求,这将是一个更有用的答案