5

我希望有人可以指导我,因为我被卡住了......我需要编写一个紧急广播系统,通知工作站出现紧急情况并在用户屏幕底部弹出一条小消息。这看起来很简单,但在多个子网中有大约 4000 个工作站。该系统需要几乎是实时的、轻量级的并且易于部署为 Windows 服务。

当我发现路由器不转发 UDP 广播数据包 xxx255 时,问题就开始了。后来我在 VB6 中做了一个简单的测试钩子来捕获网络发送消息,但即使是那些也没有通过路由器。我还编写了一个简单的数据包嗅探器来过滤数据包,只是发现网络数据包从未到达预期的目的地。

然后我看了一下并探索了使用 MSMQ over HTTP,但这需要在目标工作站上安装 IIS。由于有这么多工作站,这将是一个主要的安全问题。

现在我已经完成了一个带有异步回调的 Web 服务,它向订阅者发送事件。它在小规模上完美运行,但一旦订阅者超过 15 个,性能就会大大降低。轮询服务器并不是一个真正的选择,因为它会在服务器上产生负载(另外我也尝试过)

我需要你的帮助来指导我使用什么技术。有没有人对这么多客户使用过彗星方式,或者我应该看看 WCF 吗?

我正在使用 Visual C# 2005。请帮助我摆脱这种困境。

谢谢

4

5 回答 5

3

考虑使用 WCF 回调机制和事件。Juval Lowy有很好的介绍。

另一种模式是实现阻塞 Web 服务调用。例如,这就是 GMail 聊天的工作方式。但是,您将不得不在这里处理会话和超时。当客户端位于 NAT 和防火墙之后且无法直接访问时,它可以工作。但是对于内部网中的简单警报来说,它可能太复杂了。

于 2008-12-18T09:58:58.870 回答
3

这正是多播的设计目的。

正常的网络广播(根据定义)停留在本地子网上,不会通过路由器转发。

另一方面,多播传输可以具有各种范围,从本地子网到本地站点,甚至到全局。您所需要的只是让将您的子网连接在一起的各种路由器能够感知多播。

于 2008-12-18T15:50:43.357 回答
0

我认为这个问题最好用socket解决。

打开与服务器的连接,并保持打开状态。

于 2008-12-18T09:03:29.073 回答
0

您能否在每个子网中都有一个从属服务器,负责将消息分发给子网中的所有客户端?

然后,您可以只将从属服务器连接到启动消息的中央服务器。

于 2008-12-18T09:19:12.880 回答
0

我认为你们中的一些人对此想得太多了。每个版本的 Windows 中都已经内置了一项服务,可以提供这种确切的功能!它被称为 Messenger 服务。您所要做的就是确保此服务已启用并在所有客户端上运行。

(尽管您没有在问题中指定,但我从您选择的技术中假设该网络的客户端全部是 Windows)。

您可以使用以下工具从命令行使用此工具发送消息:

NET SEND computername "This is a test message"

NET SEND 命令还具有按 Windows 域发送的选项,或按名称发送给特定用户(无论他们在何处登录)或连接到特定 Windows 服务器的每个系统。这些选项应该可以让您轻松避免子网问题,特别是如果您在网络上使用基于域的安全性。(如果您通过服务器而不是直接向客户端发送消息,您可能需要在某些服务器上启用“警报器”服务)。

它的编程版本是一个名为NetMessageBufferSend()的 API ,它非常简单。快速浏览 P/Invoke.net 可以找到该 API 的页面,该页面不仅提供了调用 API 所需的定义,还提供了 C# 示例程序!

您根本不需要编写任何客户端代码。可能最复杂的事情将是找出对该 API 的最佳调用集,这些调用将在您的配置中完全覆盖网络。

ETA:我刚刚注意到 Messenger 服务和这个 API 在 Windows Vista 中完全消失了。微软很奇怪完全删除这样的功能。该供应商似乎有兼容的 Vista 替代品。

于 2008-12-18T14:26:43.040 回答