有什么方法可以将数据从网络服务器推送到浏览器吗?

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

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

76304 次浏览

是的,你正在寻找的是 COMET http://en.wikipedia.org/wiki/Comet_(programming)。其他好的谷歌关键词搜索是 AJAX 推送和反向 Ajax。

研究一下 Comet (一个关于 Ajax 是清洁代理的恶作剧,Comet 也是) ,它基本上是“反向 Ajax”请注意,这需要为每个用户提供一个长期的服务器连接来接收通知,因此在编写应用程序时要注意性能影响。

Http://en.wikipedia.org/wiki/comet_(programming)

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

我认为你可以使用轮询来做一些聪明的事情,使它的工作更像推送,不发送内容不变的标题,但保持连接开放,但我从来没有这样做过。

还有其他方法。不知道他们是否“更好”在你的情况。您可以拥有一个 Javaapplet,它在页面加载时连接到服务器,并等待服务器发送的内容。它在启动时会慢一些,但是允许浏览器在不经常轮询的情况下从服务器接收数据。

如果使用的是 jsp 页面,还可以查看 爪哇小推车

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

看看维基百科上的 彗星文章吧,这是个不错的起点。

你没有提供太多的信息,但如果你正在构建某种事件驱动的网站(一个‘ la digg 谍)或类似的东西,你可能会看到实现一个隐藏的 IFRAME,连接到一个网址,连接永远不会关闭,然后你会推脚本标签从服务器到客户端,以执行更新。

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

对于一个网络应用程序的“调用中心控制面板”,涉及更新代理和活动调用中心的呼叫队列状态,我们开发了一个内部解决方案,这个解决方案可以工作,但是远离你可以使用的库。

我们所做的就是在服务器上实现一个小型服务,它与电话系统通话,等待新的事件,并保存一张当时情况的照片。这项服务提供了一个小型的网络服务器。

我们的网络客户端通过 HTTP 连接到这个网络服务器,并请求获得最后一张照片(用 XML 编码) ,显示它,然后再次请求获得新照片。此时的网络服务器可以:

  • 如果有新照片,请退还
  • 阻塞客户端几秒钟(在我们的设置中是30秒) ,等待某个事件发生并更改照片。如果此时没有生成任何事件,它将返回相同的照片,只允许连接保持活动状态,而不会超时客户端。

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

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

如果有人能够提供一个实际的轻量级实现,太棒了!

Comet 实际上是由 Dojo Toolkit (http://www.dojotoolkit.org)中的 Alex Russell 创造的。这里是一个链接到更多的信息 http://cometdproject.dojotoolkit.org/

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

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

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

也许值得一试 流星伺服器,它是一个为 COMET 设计的网络服务器。漂亮的 小样和它也是由 Twitterfall使用。

可能还要看看 反向 HTTP

是的,它被称为 反向 Ajax彗星。Comet 基本上是一个总括术语,用于表示打开长期 HTTP 请求的不同方式,以便将数据实时推送到 Web 浏览器。我推荐 StreamHub 推送服务器,他们有一些很酷的演示,而且比其他服务器更容易入门。查看 Comet 和 StreamHub 入门教程快速介绍。您可以使用 CommunityEdition,它可以免费下载,但限制为20个并发用户。商业版本是非常值得的支持单独加上你得到 SSL 和桌面。NET 和 Java 客户端适配器。帮助是可用的通过 谷歌集团,有一个良好的教程在网上一堆,也有一个 GWT Comet 适配器

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

请检查这个库 https://github.com/SignalR/SignalR,了解如何在数据可用时动态地向客户端推送数据

现在您应该使用 WebSocket。 这是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
};

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

另一种标准方法是 SSE (Server-Sent Events,也称为 EventSource,位于 JavaScript 对象之后)。