有什么办法来从Web服务器推送数据到浏览器?

当然,我知道Ajax,但Ajax的问题​​是浏览器应该频繁地轮询服务器以查找是否有新的数据。 这增加了服务器负载。

有没有更好的方法(即使使用Ajax),而不是频繁地轮询服务器?

是的,你要找的是COMET http://en.wikipedia.org/wiki/Comet_(programming); 。 其他好的Googlesearch条件是AJAX-push和reverse-ajax。

是的,它被称为反向Ajax彗星 。 彗星基本上是一个涵盖长寿命HTTP请求的不同方式的总称,以便将数据实时推送到networking浏览器。 我推荐StreamHub推送服务器 ,他们有一些很酷的演示,比任何其他服务器更容易入门。 查看Comet和StreamHub教程快速入门介绍。 您可以使用可免费下载的Community Edition,但限于20个并发用户。 商业版本是非常值得的支持单独加上你得到SSL和桌面.NET和Java客户端适配器。 帮助可以通过Google Group获得 ,网上有很多教程,还有一个GWT Comet适配器 。

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

您可以轻松地启动从JavaScript的连接:

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 }; 

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

看看彗星(阿贾克斯是清洁剂,彗星也是如此),这基本上是“反向阿贾克斯”。 请注意,这需要一个长期的服务器连接,以便每个用户接收通知,以便在编写应用程序时注意性能影响。

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

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

我强烈build议在Comet上投入一些时间,但我不知道你可以使用的实际实现或库。

对于一个Web应用程序的“呼叫中心控制面板”,包括更新代理和呼叫队列状态的实时呼叫中心,我们开发了一个可行的内部解决scheme,但远离您可以使用的库。

我们所做的就是在与电话系统交谈的服务器上实施一项小型服务,等待新的事件发生,并且保存照片。 这项服务提供了一个小型networking服务器

我们的networking客户端通过HTTP连接到这个networking服务器,并要求最后一张照片(用XML编码),显示它,然后再去,要求新的照片。 这个networking服务器可以:

  • 返回新的照片,如果有的话
  • 阻止客户端几秒钟(在我们的设置30)等待一些事件ocurr和改变照片。 如果在这一点上没有生成事件,它将返回相同的照片,只允许连接保持活动状态,不超时客户端。

这样,当客户端轮询时,它会在0到30秒内得到响应。 如果一个新的事件已经产生,立即得到它),否则它会阻塞,直到产生新的事件。

这基本上是轮询,但它有点智能轮询不会过热的Web服务器。 如果彗星不是你的答案,我相信这可以实现使用相同的想法,但使用更广泛的AJAX或JSON编码更好的结果。 这是在AJAX时代之前devise的,所以有很大的改进空间。

如果有人可以提供这个实际的轻量级实现,太棒了!

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

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

Comet实际上是由Dojo Toolkit( http://www.dojotoolkit.org )的Alex Russell提出的。 这里是更多信息的链接http://cometdproject.dojotoolkit.org/

还有其他的方法。 不知道你的情况是否“更好”。 你可以有一个Java小应用程序在页面加载时连接到服务器,并等待服务器发送的东西。 这在启动时会慢很多,但是会允许浏览器不经常轮询地从服务器接收数据。

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

通过使用持久的http连接可以实现你所要的目标。

查看wikipedia上的Comet文章 ,这是一个很好的开始。

你没有提供太多的信息,但如果你正在寻找build立某种事件驱动的网站(a'la digg spy)或者其他方面的东西,你可能会考虑实现一个隐藏的IFRAME,它连接到连接永远不会closures的URL,然后将脚本标记从服务器推送到客户端以执行更新。

Meteor Server是一个为COMETdevise的Web服务器,值得一试。 很好的演示 ,它也被使用的twitterfall 。

一旦连接打开到服务器,它可以保持打开,服务器可以推内容很久以前,我使用multipart/x-mixed-replace但是这在IE中不起作用。

我认为你可以做聪明的事情与轮询,使其工作更像推送不发送内容不变的标题,但离开连接打开,但我从来没有这样做。

你可以尝试我们的彗星组件 – 虽然它是非常实验性的!

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

也许还想看看ReverseHTTP 。