从服务器端应用向客户端推送消息?

6

我有一个基于JavaScript的客户端,目前正在轮询.NET Web服务以获取新内容。虽然轮询起作用...但我对这种方法不满意,因为在没有接收到任何更改时,我使用了系统资源并创建了开销。

我的问题是如何通知我的客户端有新内容可供显示?我愿意使用任何其他技术来实现这个解决方案。

5个回答

7
首先,轮询是可行的方法。您可以使用Flash、Silverlight或Comet(http://en.wikipedia.org/wiki/Comet_(programming)),它可以为您保持一个tcp连接以进行通知。 网页本身无法保持套接字连接,因此无法直接通知Web客户端。
【编辑】 但是请考虑一下,有多少客户端可以同时向一个服务器保持tcp连接?对于较大的系统,您很快就会用完可用的套接字,因为有65k个端口可用。 您的服务器可以处理多少并发连接取决于您的硬件资源。如果您有足够的内存和CPU,应该能够处理约100k甚至更多。但是,如果每个请求都通过tcp/ip访问数据库或其他资源,则可能会受到每个IP可用端口数的限制(65k)。您还应该将推送请求发送到单独的域,因为浏览器通常将每个域限制为两个并发连接,因此您不会干扰正常的页面加载。

使用轮询与前置缓存服务器相结合是一个不错的解决方案。您可以在服务器上编写逻辑,根据每个客户端更新缓存,从而减少每次轮询的负载。您可以为已登录/轮询过的用户更新缓存,以进一步减少缓存更新。对我来说,从技术角度来看,实现拉取比推送更容易。


1
是的,可以在没有Flash和Silverlight的情况下完成;请参考关于http://en.wikipedia.org/wiki/Comet_%28programming%29的答案。 - Marcel Korpel
很棒的答案,这让我有了一些好的地方开始寻找。 - Achilles
@Mick:tcp/ip 协议中的最大端口号是 2^16。这与 .Net 或操作系统无关,当客户端发起请求时,服务器会回传一个数据端口通常在 1024-65535 范围内。每个保持开放状态(闲置或不闲置)的客户端都会占用该范围内的端口。如果有 65k 个客户端同时保持连接,则下一个客户端连接将无法获得响应,因为没有更多可用于数据传输的端口。这就是为什么轮询效果更好的原因,因为客户端(至少在理论上)每次请求后会关闭连接,使端口可重用。 - Mikael Svenson
1
我不相信这是真的。客户端连接到服务器上的特定端口,该端口上的同时连接数量仅受服务器内存和操作系统设置的限制。 - Peter Ruderman
感谢您的纠正 - 我认为该行仍存在问题:“您可能会受到每个IP可用端口数量的限制(65k)”。再次强调,在正常情况下,所有COMET消息(无论连接数多少)都将使用相同的端口,因此限制实际上在于服务器硬件和架构。这也是专门设计或修改以处理大量COMET连接的服务器具有优势的地方。 - Mick
显示剩余8条评论

2

您需要研究一下COMET技术。

COMET是一种通过HTTP开放通信线路使服务器向客户端浏览器推送数据的技术。

可能有关于COMET + WCF Web服务的示例。


2

看看WebSync,这是.NET/IIS的一种彗星解决方案。它会完全满足您的需求。不需要额外的轮询浪费资源,只在需要时进行推送,实时更新...全部都有。


1

1

你已经听说过HTTP轮询(COMET)了。这就留下了一个问题,即http服务器本身(IIS+ASP)如何在不轮询数据库的情况下检测到数据库中的更改。使用SQL Server,您可以使用像查询通知这样的技术,它允许您的ASP.Net进程在缓存的记录上发生更改时得到通知。您还可以查看LinqToCache项目,该项目允许将查询通知与LINQ查询混合使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接