2008-12-18 15 views
5

我希望有人能指导我,我坚持......我需要编写通知紧急工作站,并在弹出一个小消息紧急广播系统用户屏幕的底部。这似乎很简单,但是在多个子网上有大约4000个工作站。该系统需要几乎实时,轻量且易于部署为Windows服务。最新最好的方式将事件发送到所有工作站

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

然后,我接过来一看,并使用MSMQ HTTP上的探讨,但要在目标工作站上安装此所需的IIS。由于有这么多的工作站,这将是一个重大的安全问题。

现在我已经完成了一个异步回调的Web服务,它向订阅者发送一个事件。它在小范围内完美运行,但一旦超过15个用户的性能就会大大降低。轮询服务器是不是一个真正的选择,因为负载会在服务器上生成(加上我已经试过了太)

我需要你的帮助来指导我一下,用什么样的技术。有谁使用过这么多客户的彗星方式,还是应该看看WCF?

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

谢谢

+0

你不需要MSMQ的IIS ... – 2009-01-18 05:55:58

回答

3

考虑使用WCF回调机制和事件。 Juval Lowy有good introduction

另一种模式是执行blocking web-service calls。例如,这就是GMail聊天的工作原理。但是,您将不得不在这里处理会话和超时。它适用于客户端位于NAT和防火墙后方且无法直接访问的情况。但是对于Intranet中的简单警报,它可能太复杂了。

0

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

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

+0

打开到服务器的连接工作。打开4000个插座可能会有效,但恐怕它不会太好。 – Piskvor 2008-12-18 10:06:54

0

你可以在该负责子网分配消息发送给所有客户端每个子网从服务器?

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

+0

你是对的,但我不认为我可以得到硬件。有大约50个子网,这意味着一台服务器与每个udp客户端有50个tcp连接。所以我需要客户端能够为奴隶“提名”自己,以防工作站重启/等。你会推荐WCF吗? – Tyler 2008-12-18 09:47:06

+0

它可能成为一个配置噩梦 – 2008-12-18 09:59:49

0

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

(虽然你没有在问题中指定,我从你的技术的选择,这个网络的客户群是所有Windows假设)。

您可以使用像这样使用这个设施的命令行发送邮件:

NET SEND computername "This is a test message" 

的NET SEND命令也有自己的选择按名称发送由Windows域,或特定的用户,无论他们在哪里已登录或连接到特定Windows服务器的每个系统。这些选项可让您轻松避免子网问题,特别是在您的网络上使用基于域的安全性时。 (如果您通过服务器发送消息而不直接发送给客户端,则可能需要在某些服务器上启用“Alerter”服务)。

这个程序化版本是一个名为NetMessageBufferSend()的API,它非常简单。对P/Invoke.net的快速扫描发现page for this API不仅提供了需要调用API的定义,还提供了C#示例程序!

根本不需要编写任何客户端代码。可能涉及最多的事情是找出对此API的最佳调用集合,以便在您的配置中完整覆盖网络。

ETA:我刚刚注意到Messenger服务和此API在Windows Vista中完全没有了。微软很奇怪完全删除这样的功能。它似乎是Vista的this vendor has a compatible replacement

3

这正是Multicast的设计目的。

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

另一方面,多播传输可以有各种范围,从本地子网到本地站,甚至全球范围。您需要的只是将各个子网连接在一起的各种路由器都可以识别组播。

相关问题