关于ajax:是否有某种方法可以将数据从Web服务器推送到浏览器?

关于ajax:是否有某种方法可以将数据从Web服务器推送到浏览器?

Is there some way to PUSH data from web server to browser?

我当然知道Ajax,但是Ajax的问题在于浏览器应该经常轮询服务器以查找是否有新数据。 这会增加服务器负载。

除了频繁轮询服务器之外,还有什么更好的方法(甚至使用Ajax)吗?


是的,您正在寻找的是COMET http://en.wikipedia.org/wiki/Comet_(编程)。要搜索的其他优质Google术语还有AJAX-push和反向ajax。


是的,它叫做反向Ajax或Comet。 Comet基本上是总括性术语,用于表示打开长期HTTP请求以将数据实时推送到Web浏览器的不同方式。我建议使用StreamHub Push Server,它们有一些不错的演示,并且比其他任何服务器都容易上手。查看《 Comet和StreamHub入门指南》以获取快速介绍。您可以使用社区版,该社区版可免费下载,但仅限20个并发用户。仅提供支持就非常值得商业版本,另外您还可以获得SSL以及Desktop .NET和Java客户端适配器。可以通过Google网上论坛获得帮助,网络上有很多教程,还有GWT Comet适配器。


现在,您应该使用WebSockets。
这是2011年标准,允许使用HTTP发起连接,然后将其升级为基于客户端和服务器的双向消息通信。

您可以通过javascript轻松启动连接:

1
2
3
4
5
6
var ws = new WebSocket("ws://your.domain.com/somePathIfYouNeed?args=any");
ws.onmessage = function (evt)
{
  var message = evt.data;
  //decode message (with JSON or something) and do the needed
};

服务器端处理取决于您的技术堆栈。


研究Comet(它是Ajax是清洁剂的事实的欺骗,Comet也是如此),它基本上是"反向Ajax"。请注意,这要求每个用户都需要长期的服务器连接才能接收通知,因此在编写应用程序时请注意性能影响。

http://en.wikipedia.org/wiki/Comet_(programming)


彗星绝对是您想要的。根据您的语言/框架要求,有不同的服务器库可用。例如,WebSync是面向ASP.NET/C#/IIS开发人员的IIS集成的彗星服务器,如果需要与其他语言进行更紧密的集成,则还有很多其他独立服务器。


Comet的一个有趣替代方法是在Flash中使用套接字。


我强烈建议您花一些时间在Comet上,但是我不知道您可以使用的实际实现或库。

对于Web应用程序的某种"呼叫中心控制面板",其中涉及为实时Callcenter更新代理和呼叫队列状态,我们开发了一种内部解决方案,该解决方案可以运行,但离您可以使用的库很远。

我们要做的是在与电话系统对话的服务器上实现一个小型服务,等待新事件并维护情况的照片。该服务提供了一个小型Web服务器。

我们的Web客户端通过HTTP连接到该Web服务器,并索要最后一张照片(以XML编码),将其显示,然后再次查找新照片。此时,Web服务器可以:

  • 返回新照片(如果有)
  • 阻止客户端几秒钟(在我们的设置中为30秒),等待事件发生并更改照片。如果此时未生成任何事件,它将返回同一张照片,仅允许连接保持活动状态,而不会使客户端超时。

这样,当客户端进行轮询时,它将在最多0到30秒内得到响应。如果已经生成了新事件,它将立即获取它),否则它将阻塞直到生成新事件。

它基本上是轮询,但是它有点聪明,不会使Web服务器过热。如果Comet不是您的答案,我相信可以使用相同的想法来实现,但是可以使用更广泛的AJAX或JSON编码来获得更好的结果。这是在AJAX时代之前设计的,因此还有很多改进的空间。

如果有人可以提供这种方法的实际轻量级实现,那就太好了!


另一种标准方式是SSE(服务器发送事件,在JavaScript对象之后也称为EventSource)。


彗星实际上是由Dojo Toolkit(http://www.dojotoolkit.org)的Alex Russell创造的。这是更多信息的链接http://cometdproject.dojotoolkit.org/


您可以在客户端使用Flash / Flex应用程序,在服务器端使用BlazeDS或LiveCycle。可以使用RTMP连接将数据推送到客户端。请注意,RTMP使用非标准端口。但是,如果端口被阻塞,您可以轻松地返回轮询。


值得一看的Meteor Server是为COMET设计的Web服务器。不错的演示,twitterfall也使用它。


通过使用持久的http连接,可以实现您的目标。

在Wikipedia上查看Comet文章,这是一个不错的起点。

您提供的信息不多,但是如果您正在考虑构建某种事件驱动的网站(a'la digg spy)或类似的东西,您可能会希望实现与之连接的隐藏IFRAME一个从不关闭连接的URL,然后您将脚本标记从服务器推送到客户端以执行更新。


还有其他方法。不知道它们在您的情况下是否"更好"。您可能有一个Java小程序,该Java小程序在页面加载时连接到服务器,并等待服务器发送内容。它的启动速度会慢很多,但是将允许浏览器不频繁地从服务器接收数据,而无需轮询。


打开与服务器的连接后,它可以保持打开状态,服务器可以推送内容很久以前我使用multipart/x-mixed-replace所做的操作,但这在IE中不起作用。

我认为您可以通过轮询来做一些聪明的事情,通过不发送内容不变的标头,而是保持连接打开,使其更像推,但我从未做到过。


请检查此库https://github.com/SignalR/SignalR以了解如何在数据可用时将其动态推送到客户端


您可以尝试我们的Comet组件-尽管这是非常实验性的...!


可能还想看看ReverseHTTP。


如果您正在使用jsp页面,也可以查看Java Pushlets。


推荐阅读