有几种不同的方法可以实现这一点。其中一些已经在这里得到了回答,但我想包括更多一些以及我对它们的想法。
1. 投票
频繁向服务器发出请求以检查新信息。这是最糟糕的方法,但可能是最简单的方法。如果您的网站的用户数量较少,那么这样做可能值得。
这可以通过使用来完成setInterval(myFunction, n)
在 JavaScript 中发送XMLHttpRequests
到服务器每隔n
毫秒。然后,在服务器上,您可以使用新信息(当您拥有新信息时)或一些暗示没有新信息的消息来响应此信息。
2. 长轮询
加载页面时,它会向服务器请求新信息。服务器保持连接打开,直到有东西要发回。此方法减少了使用的网络流量,但增加了服务器上使用的资源。您可以将其用于少量用户,但它的扩展性不太好。
最简单的方法是让处理 AJAX 请求的页面简单地等待新信息可用,然后做出响应。这可能会占用服务器上的大量连接。所以,请谨慎使用。
3. COMET
COMET http://ajaxian.com/archives/comet-a-new-approach-to-ajax-applications基本上是长轮询,但服务器已正确设置。它知道这些连接不是“真实的”,并且它使用更少的资源来处理它们。这是解决此问题的一个很好的解决方案,但它需要为此目的明确设置服务器。有 COMET 服务器和其他流行服务器的 COMET 插件,但它需要一些设置,有时还需要一些钱。
在 .NET 上实现这一点并不是世界上最简单的事情。您可以付费购买解决方案,尝试找到其他人执行类似操作的代码,或者尝试自己编写。我还没有找到任何合适的免费解决方案。如果其他人有,请评论。
4. RIA
另一种解决方案是在页面上包含 Flash、Silverlight 或 Java Applet。人们通常通过使用 1x1 对象来做到这一点,以便他们可以使用 Flash 或 Silverlight 与服务器通信。如果您不介意添加依赖项,这是一个不错的解决方案。如果您已经了解 Silverlight 或 Flash,那么实现起来可能相对简单。
您可以在互联网上找到每个选项的教程。
5. 网络套接字
如果您处于最前沿,您可以查看网络套接字 http://dev.w3.org/html5/websockets/。它仅在最新版本的现代浏览器中可用。它是 HTML5 的一部分,但现在可能是它自己的规范。无论如何,这意味着旧版浏览器将无法处理它。但是,如果您不介意限制自己使用最新的浏览器,则可以使用这个令人惊叹的功能。
我相信Chromium http://blog.chromium.org/2009/12/web-sockets-now-available-in-google.html是目前唯一支持它的浏览器。不过,我们正在努力在 Firefox 和 WebKit 中实现这一点。
我会让你免于争议,只是说这正是你想要的。规范的摘要说明了一切。
该规范定义了一个 API,使网页能够使用 Web Sockets 协议与远程主机进行双向通信。
特别提及
如果您对 Node JS 世界感兴趣,那么您不会出错套接字IO http://socket.io/。它将实现浏览器可用的最佳技术。
结论
最好的选择是 Node JS 上的 Socket.IO。但是,对于 ASP.Net 解决方案,如果可以的话,请选择 COMET 或 Web Sockets。否则,使用 Flash/Silverlight 并不可怕。最后,轮询和长轮询应该是最后的手段。您始终可以支持其中一种,如果客户端浏览器不支持,则可以回退到另一种。