长轮询没有循环

时间:2015-08-26 16:57:55

标签: ajax networking websocket long-polling

我对计算机很陌生,特别是对Web开发非常陌生。

我的问题是关于长轮询。

使用HTTP 1.0保持连接活动的简单方法是让ajax调用一遍又一遍地循环。

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

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

两者之间的唯一区别是循环发生的地方。

但是,两者看起来都很丑陋。

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

我这叫什么'websockets'?

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

感谢。

2 个答案:

答案 0 :(得分:0)

如果您只想使用js,可以使用以下内容:

Catch是你必须每次都打开连接,除非你可以在服务器端打开你的连接:

(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>

答案 1 :(得分:0)

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

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

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

这种安排提出了两个问题:

  1. 服务器无法联系客户端&#34; push&#34;网络连接关闭后的新数据。

  2. 由于网络连接的一个重要特征叫做“慢启动”,这会导致网络速度下降。

  3. AJAX尝试通过打开新连接来解决第一个问题(更新旧数据),并且&#34;拉动&#34;数据

    每隔一段时间,浏览器就会创建一个新的连接,询问服务器&#34;是什么?&#34;。如果存在新数据,则服务器将使用新数据进行应答。否则,服务器回答&#34;没什么新的&#34;。

    将AJAX视为服务器唠叨的妻子。 &#34;循环&#34;在浏览器上使用JavaScript完成,这是唯一可以打开新连接的人(因此服务器没有使用后台进程)。

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

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

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

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

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