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

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

有帮助吗?

解决方案

是的,您要找的是 COMET http://en.wikipedia.org/wiki/Comet_(编程). 。其他值得搜索的 Google 术语是 AJAX-push 和 reverse-ajax。

其他提示

是的,它叫 反向阿贾克斯 或者 彗星. 。Comet 基本上是打开长期 HTTP 请求以将数据实时推送到 Web 浏览器的不同方式的总称。我会推荐 StreamHub推送服务器, ,他们有一些很酷的演示,并且比任何其他服务器都更容易上手。查看 Comet 和 StreamHub 入门教程 快速介绍。您可以使用社区版,该版可免费下载,但并发用户数限制为 20 个。仅就支持而言,商业版本就非常值得,而且您还可以获得 SSL 和桌面 .NET 和 Java 客户端适配器。可以通过以下方式获得帮助 谷歌集团, ,网上有很多很好的教程,还有一个 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
};

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

看看彗星(关于Ajax是清洁剂的事实,彗星也是如此),这基本上是“反向Ajax”。请注意,这需要一个长寿命的服务器连接供每个用户接收通知,因此请注意编写应用程序时的性能含义。

http://en.wikipedia.org/wiki/Comet_(编程)

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

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

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

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

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

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

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

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

如果有人可以提供一个实际的轻量级实现,那就太好了!

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

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

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

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

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

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

查看 彗星文章 在维基百科上,这是一个很好的起点。

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

可能值得一看 流星服务器 这是专为 COMET 设计的 Web 服务器。好的 演示 它也被使用 推特坠落.

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

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

您可以尝试我们的 彗星组件 -虽然它是 极其 实验性的...!

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

您还可以查看 Java Pushlet 如果您使用的是 jsp 页面。

可能想看看 反向HTTP 还。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top