【问题标题】:Long-polling without looping没有循环的长轮询
【发布时间】:2015-11-20 20:03:06
【问题描述】:

我是一般计算机的新手,尤其是网络开发方面的新手。

我的问题是关于长轮询。

使用 HTTP 1.0 保持连接活动的简单方法是让 ajax 调用不断循环。

更复杂的方法是将循环移动到后端并让服务器脚本仅在必要时发送答案。

这样会更好,因为它不会对网络造成太大压力,但它仍然需要不必要的计算机操作,这些操作源于不断循环来检查条件。

两者之间的唯一区别是循环发生的位置。

不过,两者都显得老套。

如何建立连接并仅在新的状态更改在某处创建中断时才执行操作?

这就是所谓的“websockets”?

毕竟,这似乎是最复杂的做事方式,类似于电话系统。

谢谢。

【问题讨论】:

    标签: ajax networking websocket long-polling


    【解决方案1】:

    根据您的问题,我了解到在这种情况下,关于 AJAX 长拉以及服务器与客户端的功能可能存在一些混淆。

    让我们从头开始。与 Websocket 连接和一些 HTTP 流技术不同,HTTP 连接在客户端(浏览器)完成数据下载后关闭。

    只有客户端(浏览器)可以启动与服务器的网络连接。服务器无法发起连接。

    这种安排引发了两个问题:

    1. 网络连接关闭后,服务器无法联系客户端并“推送”新数据。

    2. 这会导致网络速度变慢,因为网络连接的一项重要功能称为“慢启动”。

    AJAX 尝试通过打开新连接和“拉取”数据来解决第一个问题(更新旧数据)。

    浏览器每隔一段时间就会创建一个新连接,询问服务器“怎么了?”。如果存在新数据,则服务器以新数据进行应答。否则服务器会回答“没什么新东西”。

    将 AJAX 想象成服务器唠叨的妻子。 “循环”是在浏览器上使用 JavaScript 完成的,它是唯一可以打开新连接的浏览器(因此服务器不使用后台进程)。

    另一方面,Websockets 和 HTTP/2 通过尝试避免重复的“慢启动”(重复使用相同的连接意味着连接已经运行得更快)来解决网络应用程序性能问题,并且允许服务器“推送”数据(消除过多的流量)。

    当您使用 Websockets 时,将新数据推送到客户端是服务器的责任,如果连接丢失,则客户端(浏览器)有责任重新连接到服务器(这可能并且可能通常应该发生以确保网络可操作性)时不时)。

    服务器需要跟踪连接并将正确的数据发送到正确的客户端。

    这允许以牺牲服务器资源和程序员的工作时间为代价来提高性能和更好地利用网络资源。在我看来,这笔交易非常值得。 Websockets 非常棒,它们与 HTTP/2 一起应该可以帮助我们创造出令人惊叹的东西和卓越的用户体验。

    有关客户端(浏览器)使用的不同 JavaScript 代码的示例,您可以阅读 Rony 的答案。

    【讨论】:

      【解决方案2】:

      如果你只想使用 js,你可以使用类似下面的东西:

      请注意,除非您可以在服务器端保持连接打开,否则您每次都必须打开连接:

      (function poll(){
         setTimeout(function(){
            $.ajax({ url: "server", success: function(data){
              //Update your dashboard gauge
              salesGauge.setValue(data.value);
      
              //Setup the next poll recursively
              poll();
            }, dataType: "json"});
        }, 30000);
      })();
      

      使用 websocket,您可以实现如下所示:

      <script src="/socket.io/socket.io.js"></script>
      <script>
        var socket = io.connect("http://localhost");
        socket.on('something', function (data) {
      
          //do something with data
      
          socket.emit('somethingelse', { my: 'data' });
        });
      </script>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-03-14
        • 1970-01-01
        • 1970-01-01
        • 2014-03-14
        • 1970-01-01
        • 2012-04-06
        • 2013-08-08
        • 1970-01-01
        相关资源
        最近更新 更多