【问题标题】:Is there some way to PUSH data from web server to browser?有没有办法将数据从网络服务器推送到浏览器?
【发布时间】:2010-09-06 09:46:22
【问题描述】:

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

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

【问题讨论】:

  • 我不确定是否有。为了使应用程序在概念上更简单,我想您可以在轮询请求之上实现一个传输层,从而从应用程序逻辑中删除轮询责任。也许有人甚至已经实现了这个? 编辑: 显然它被称为 en.wikipedia.org/wiki/Reverse_Ajax">reverseAjax 和 en.wikipedia.org/wiki/Comet_(programming)">Comet</a>,但目前看来您必须自己实现它。一个 JavaScript 库,有人吗?
  • @Rachel - 实时更新,这样您就可以看到其他人在做什么。适用于 StackOverflow 等网站和 Google 文档等协作网络应用程序。
  • 任何在 2016 年做这种事情的人可能会发现 websockets 是这种通信的更好选择。

标签: ajax webserver comet


【解决方案1】:

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

【讨论】:

  • 绝对是要走的路,一旦你自己开始实现它,你就会意识到有多少工作要做——重新连接、长轮询、流 iframe、跨浏览器支持、HTTPS...跨度>
  • 对彗星的解释将有助于回答这个问题
  • @Satir:添加了一个快速解释。其他答案有维基百科文章的链接。
【解决方案2】:

另一种标准方式是SSE (Server-Sent Events, also known as EventSource,在 JavaScript 对象之后)。

【解决方案3】:

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

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

【讨论】:

  • 与服务器发送的事件:stackoverflow.com/questions/5195452/…
  • 我完全同意...使用 HTTP 进行双向通信就像在 REST 调用中思考让马里奥跳上龟壳...这太疯狂了。你不需要提出请求并等待简单的按钮按下人们的响应......你只是没有。 HTTP 是一种文档协议。超文本传输​​协议。 Ajax Push 是一种非常复杂的方法,可以绕过 HTTP 来完成 WebSocket 的设计。不要再傻了,使用正确的工具来完成这项工作。
  • 你真的很喜欢省略号,有时还有一种新形式的四个点,我称之为“省略号”!
【解决方案4】:

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

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

【讨论】:

    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

      彗星绝对是你想要的。根据您的语言/框架要求,有不同的服务器库可用。例如,WebSync is an IIS-integrated comet server for ASP.NET/C#/IIS developers,如果您需要与其他语言更紧密地集成,还有许多其他独立服务器。

      【讨论】:

        【解决方案7】:

        可能还想看看ReverseHTTP

        【讨论】:

          【解决方案8】:

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

          【讨论】:

            【解决方案9】:

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

            在维基百科上查看Comet article,这是一个很好的起点。

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

            【讨论】:

              【解决方案10】:

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

              【讨论】:

                【解决方案11】:

                你可以试试我们的Comet Component - 虽然它是非常实验性的......!

                【讨论】:

                  【解决方案12】:

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

                  【讨论】:

                    【解决方案13】:

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

                    【讨论】:

                      【解决方案14】:

                      是的,您要查找的是 COMET http://en.wikipedia.org/wiki/Comet_(programming)。其他可以搜索的优秀 Google 术语是 AJAX-push 和 reverse-ajax。

                      【讨论】:

                        【解决方案15】:

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

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

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

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

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

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

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

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

                        【讨论】:

                          【解决方案16】:

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

                          【讨论】:

                            【解决方案17】:

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

                            【讨论】:

                              【解决方案18】:

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

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

                              【讨论】:

                                猜你喜欢
                                • 1970-01-01
                                • 2015-09-15
                                • 2017-07-11
                                • 1970-01-01
                                • 2010-12-29
                                • 1970-01-01
                                • 1970-01-01
                                • 2018-05-13
                                • 1970-01-01
                                相关资源
                                最近更新 更多