zoukankan      html  css  js  c++  java
  • Ajax、反向Ajax和WebSocket 概念

    Ajax  

    异步的JavaScript和XML(Asynchronous JavaScript and XML,Ajax),一种可通过JavaScript来访问的浏览器功能特性,其允许脚本向幕后的网站发送一个HTTP请求而又无需重新加载页面。Ajax的出现已经超过了十年,尽管其名字中包含了XML,但你几乎可以在Ajax请求中传送任何的东西,最常用的数据是JSON,其与JavaScript语法很接近,且消耗更少带宽。清单1给出了这样的一个例子,Ajax请求通过某个地方的邮政编码来检索该地的名称。

      清单1. Ajax请求举例

    var url ='http://www.geonames.org/postalCodeLookupJSON?postalcode='
      + $('#postalCode').val() +'&country='
      + $('#country').val() +'&callback=?';
      $.getJSON(url, function(data) {
      $('#placeName').val(data.postalcodes[0].placeName);
    });

    反向Ajax

      反向Ajax(Reverse Ajax)本质上则是这样的一种概念:能够从服务器端向客户端发送数据。在一个标准的HTTP Ajax请求中,数据是发送给服务器端的,反向Ajax可以某些特定的方式来模拟发出一个Ajax请求,服务器就可以尽可能快地向客户端发送事件(低延迟通信)。

      反向Ajax的目的是允许服务器端向客户端推送信息。Ajax请求在缺省情况下是无状态的,且只能从客户端向服务器端发出请求。你可以通过使用技术模拟服务器端和客户端之间的响应式通信来绕过这一限制。

    TTP轮询和JSONP轮询

      轮询(polling)涉及了从客户端向服务器端发出请求以获取一些数据,这显然就是一个纯粹的Ajax HTTP请求。为了尽快地获得服务器端事件,轮询的间隔(两次请求相隔的时间)必须尽可能地小。但有这样的一个缺点存在:如果间隔减小的话,客户端浏览器就会发出更多的请求,这些请求中的许多都不会返回任何有用的数据,而这将会白白地浪费掉带宽和处理资源。

      图1中的时间线说明了客户端发出了某些轮询请求,但没有信息返回这种情况,客户端必须要等到下一个轮询来获取两个服务器端接收到的事件。

      图1. 使用HTTP轮询的反向Ajax

      JSONP轮询基本上与HTTP轮询一样,不同之处则是JSONP可以发出跨域请求(不是在你的域内的请求)。清单1使用JSONP来通过邮政编码获取地名,JSONP请求通常可通过它的回调参数和返回内容识别出来,这些内容是可执行的JavaScript代码。

      要在JavaScript中实现轮询的话,你可以使用setInterval来定期地发出Ajax请求,如清单2所示:

      清单2. JavaScript轮询

    setInterval(function() {
      $.getJSON('events', function(events) {
        console.log(events);
      });
    }, 2000);

     

    用JavaScript实现的轮询的优点和缺点:

      1. 优点:很容易实现,不需要任何服务器端的特定功能,且在所有的浏览器上都能工作。

      2. 缺点:这种方法很少被用到,因为它是完全不具伸缩性的。试想一下,在100个客户端每个都发出2秒钟的轮询请求的情况下,所损失的带宽和资源数量,在这种情况下30%的请求没有返回数据。

    Piggyback

      捎带轮询(piggyback polling)是一种比轮询更加聪明的做法,因为它会删除掉所有非必需的请求(没有返回数据的那些)。不存在时间间隔,客户端在需要的时候向服务器端发送请求。不同之处在于响应的那部分上,响应被分成两个部分:对请求数据的响应和对服务器事件的响应,如果任何一部分有发生的话。(是不是类似提交请求之前进行检测,参数不合要求则不去请求?)

    你可以看到表单验证的结果和附加到响应上的事件,同样,这种方法也有着一些优点和缺点:

      1. 优点:没有不返回数据的请求,因为客户端对何时发送请求做了控制,对资源的消耗较少。该方法也是可用在所有的浏览器上,不需要服务器端的特殊功能。

      2. 缺点:当累积在服务器端的事件需要传送给客户端时,你却一点都不知道,因为这需要一个客户端行为来请求它们。

    Comet

      使用了轮询或是捎带的反向Ajax非常受限:其不具伸缩性,不提供低延迟通信(只要事件一到达服务器端,它们就以尽可能快的速度到达浏览器端)。Comet是一个web应用模型,在该模型中,请求被发送到服务器端并保持一个很长的存活期,直到超时或是有服务器端事件发生。在该请求完成后,另一个长生存期的Ajax请求就被送去等待另一个服务器端事件。使用Comet的话,web服务器就可以在无需显式请求的情况下向客户端发送数据。

      Comet的一大优点是,每个客户端始终都有一个向服务器端打开的通信链路。服务器端可以通过在事件到来时立即提交(完成)响应来把事件推给客户端,或者它甚至可以累积再连续发送。因为请求长时间保持打开的状态,故服务器端需要特别的功能来处理所有的这些长生存期请求。

    WebSocket

      WebSocket技术来自HTML5,是一种最近才出现的技术,许多浏览器已经支持它(Firefox、Google Chrome、Safari等等)。WebSocket启用双向的、全双工的通信信道,其通过某种被称为WebSocket握手的HTTP请求来打开连接,并用到了一些特殊的报头。连接保持在活动状态,你可以用JavaScript来写和接收数据,就像是正在用一个原始的TCP套接口一样。

    参考博客:http://kb.cnblogs.com/page/112185/

  • 相关阅读:
    微信获取openid过滤黑名单_写入文件_多协程版5500条10几秒
    微信获取openid写入文件golang版_golang获取微信openid写入文件
    go开发桌面应用源码_go Socket_golang Socket_golang开发桌面应用源码_go客户端服务端
    go常用代码片段_golang常用代码
    go基本语法_golang基本语法
    Java常用集合-List(ArrayList、Vector和LinkedList)简介
    mysql sql 将性别1和2转换成女和男
    支付宝当面付Demo测试
    PageResult
    返回结果
  • 原文地址:https://www.cnblogs.com/panie2015/p/5569611.html
Copyright © 2011-2022 走看看