4

我需要创建一个可以在我们的几个本地 Windows 客户端机器上运行的 C# 程序。这些“客户端”程序必须从另一台机器上运行的“管理员”程序中获取命令。这些命令可能是重新启动客户端计算机,将有关 IP 地址等的一些本地信息返回给“管理”程序。

但是如何做到这一点呢?我对 WCF 了解一点,但这是正确的方法吗?如果我使用 WCF,我将不得不让客户端程序运行一个服务方法,就像每秒一样,以检查新命令。使用套接字,我建立了一个“直接”连接,客户端只是等待接收命令——这不是正确的理解吗?

我应该走哪条路?

我们正在谈论大约 10 个客户端,我想要 1 秒的最大延迟(发送命令 - 接收信息)。

任何提示也将不胜感激。

最好的祝福

4

6 回答 6

5

双工 WCF 服务器。基本上,客户端都连接到服务器(因此只有一台服务器),并且服务器使用其双工通道在需要时回调客户端。没有轮询,可以很好地扩展等。您需要处理的最令人头疼的事情是设置一个较长的超时时间,以防您有一段时间没有发送任何内容,从而导致通道超时。

WCF 最终会变得更加简单。

几个链接:

http://msdn.microsoft.com/en-us/library/ms731064.aspx

http://www.codeproject.com/Articles/491844/A-Beginners-Guide-to-Duplex-WCF

我希望那些帮助。

于 2013-05-17T14:38:33.127 回答
1

您可以让 WCF 客户端充当服务器,并使用命令和控制程序连接到它们,这没问题。如果您不想弄乱套接字可能带来的丑陋东西,请选择 WCF。WCF 可以在 app.config 中很好地配置,即使不需要 IIS 服务器,您也可以使其真正成为自托管的命令行应用程序。然后配置将是可重用的并且更易于维护。

于 2013-05-17T14:26:21.287 回答
1

您可以使用 .NET Remoting,它可以提供从服务器到客户端的“推送”反向通道(使用“回调”)。它不需要另一个方向的第二个 TCP 连接,因此您不需要弄乱客户端的防火墙和路由器。

远程处理被认为是过时的,但它有它的位置。

在任何情况下,我都不会使用 WCF 轮询技术。这会导致服务器出现不良延迟和 DDOS 情况。

如果您可以让客户端打开一个端口,那么托管 WCF 服务可能是最好的主意。

于 2013-05-17T14:28:03.523 回答
1

由于您提到的机器数量少且性能要求适中,我认为 WCF 最终会比套接字更容易。

您可能会查看 Duplex WCF。我从来没有使用过它,而且 WCF 在过去任何时候我需要任何不寻常的东西时都会让我头疼,但它是针对您正在谈论的那种问题。

如果所有机器都在一个网络上,这里有一个受消息队列启发的创造性替代方案:您可以使用数据库表作为消息出现的地方,并在闲暇时被客户阅读。客户可以查询它并说:给我所有 MessageID > LastReceivedMessageID 的消息。

最后一种方法的缺点是(a)尽管您的数据库服务器应该能够处理它,但您仍在进行轮询,并且(b)如果您可能需要在网络之外使用它,则需要 VPN 或新的解决方案。

于 2013-05-17T14:29:53.790 回答
1

我会推荐一个套接字实现,因为从长远来看它可能会给你更大的灵活性。您可以使用套接字命名空间自己从头开始创建它。作为替代方案,您可以使用现成的网络库解决方案。结帐lidgrenNetworkComms.Net

免责声明:我是 NetworkComms.Net 的开发人员。

于 2013-05-17T14:43:49.167 回答
0

你可以使用 MSMQ ......再简单不过了

http://msdn.microsoft.com/en-us/library/windows/desktop/ms711472(v=vs.85).aspx

我将 MSMQ 用于许多类似的应用程序。完美运行。

于 2013-05-17T14:31:20.957 回答