137

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

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

4

18 回答 18

71

是的,您正在寻找的是 COMET http://en.wikipedia.org/wiki/Comet_(programming)。其他好的谷歌搜索词是 AJAX-push 和 reverse-ajax。

于 2008-08-21T14:07:00.340 回答
37

是的,它被称为Reverse AjaxComet。Comet 基本上是打开长期 HTTP 请求以将数据实时推送到 Web 浏览器的不同方式的总称。我推荐StreamHub Push Server,他们有一些很酷的演示,并且比任何其他服务器都更容易上手。查看Comet 和 StreamHub 入门教程以获得快速介绍。您可以使用可免费下载的社区版,但仅限于 20 个并发用户。商业版本非常值得单独支持,而且您还可以获得 SSL 和 Desktop .NET & Java 客户端适配器。可通过Google Group获得帮助,网上有很多教程,还有一个GWT Comet 适配器

于 2009-09-25T16:29:32.523 回答
34

现在你应该使用 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
};

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

于 2013-10-18T20:11:53.917 回答
10

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

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

于 2008-08-21T14:08:12.880 回答
6

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

于 2009-11-27T15:59:04.040 回答
5

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

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

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

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

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

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

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

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

于 2008-08-21T15:49:24.557 回答
5

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

于 2008-09-18T21:13:21.830 回答
5

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

于 2015-03-10T17:25:52.453 回答
4

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

于 2008-09-03T03:42:40.910 回答
2

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

于 2008-08-21T14:09:08.370 回答
2

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

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

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

于 2008-08-21T14:11:10.597 回答
2

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

于 2008-11-20T16:23:10.350 回答
2

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

于 2009-03-05T18:40:20.897 回答
1

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

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

于 2008-08-21T14:09:06.280 回答
1

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

于 2008-11-20T09:28:38.877 回答
1

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

于 2013-03-24T12:17:37.850 回答
0

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

于 2008-08-21T14:10:33.220 回答
0

可能还想看看ReverseHTTP

于 2009-03-19T08:40:53.470 回答