概念:

轮询(polling):客户端按规定时间定时像服务端发送ajax请求,服务器接到请求后马上返回响应信息并关闭连接。

概念总是枯燥的,只有代码方能解心头之快

前段代码:index.html:

  1. <html>
  2.  
  3. <head>
  4.  
  5. <title></title>
  6.  
  7. <script src="http://lib.sinaapp.com/js/jquery/1.9.1/jquery-1.9.1.min.js"></script>
  8.  
  9. </head>
  10.  
  11. <body>
  12.  
  13. </body>
  14.  
  15. <script type="text/javascript">
  16.  
  17. var getting = {
  18.  
  19. url:'server.php',
  20.  
  21. dataType:'json',
  22.  
  23. success:function(res) {
  24.  
  25. console.log(res);
  26.  
  27. }
  28.  
  29. };
  30.  
  31. //关键在这里,Ajax定时访问服务端,不断获取数据 ,这里是1秒请求一次。
  32.  
  33. window.setInterval(function(){$.ajax(getting)},1000);
  34.  
  35. </script>
  36.  
  37. </html>

  服务端PHP代码:server.php

  1. <?php
  2.  
  3. $conn = mysqli_connect("localhost","root","","test");
  4.  
  5. $resource = $conn ->query('select * from t');
  6.  
  7. $result = $resource->fetchall();
  8.  
  9. if ($result) {
  10.  
  11. //exits data
  12.  
  13. print_r(json_encode(array('success'=>'存在数据')));
  14.  
  15. }
  16.  
  17. print_r(json_encode(array('failed'=>'不存在数据')));
  18.  
  19. $conn.close
  20.  
  21. ?>

  上面就是最基本最简化的Ajax轮询。判断t表是否有数据,并执行对应输出。 实际项目中的话查询语句就根据实际需求来定就可以了。

从代码我们可以看出,客户端是按照规定时间(这个时间由你设定,此处默认为1秒)像服务端发送请求,前一次请求完成后,无论有无结果返回,一秒之后下一次请求又会发出。这就叫做Ajax轮询。

最关键的地方在于,客户端需要通过JS设定一个定时器,按照规定时间不断的请求。

好,轮询完了,我们来看一下长轮询

Ajax长轮询属于Ajax轮询的升级版,在客户端和服务端都进行了一些改造,使得消耗更低,速度更快。

"不间断的通过Ajax查询服务端"。

同样看代码说话:

前端代码:

  1. <html>
  2.  
  3. <head>
  4.  
  5. <title></title>
  6.  
  7. <script src="http://lib.sinaapp.com/js/jquery/1.9.1/jquery-1.9.1.min.js"></script>
  8.  
  9. </head>
  10.  
  11. <body>
  12.  
  13. </body>
  14.  
  15. <script type="text/javascript">
  16.  
  17. //前端Ajax持续调用服务端,称为Ajax轮询技术
  18.  
  19. var getting = {
  20.  
  21. url:'server.php',
  22.  
  23. dataType:'json',
  24.  
  25. success:function(res) {
  26.  
  27. console.log(res);
  28.  
  29. $.ajax(getting); //关键在这里,回调函数内再次请求Ajax
  30.  
  31. }
  32. //当请求时间过长(默认为60秒),就再次调用ajax长轮询
  33. error:function(res){
  34. $.ajax($getting);
  35. }
  36.  
  37. };
  38.  
  39. $.ajax(getting);
  40.  
  41. </script>
  42.  
  43. </html>

  

服务端代码:

  1. <?php
  2. //这段AJAX请求时间永不过期
  3. set_time_limit(0);
  4.  
  5. $pdo = new PDO('mysql:dbname=test;host=127.0.0.1','root','root');
  6.  
  7. $resource = $pdo->query('select * from t1');
  8.  
  9. $result = $resource->fetchall();
  10.  
  11. while (true) {
  12.  
  13. if ($result) {
  14.  
  15. //exits data
  16.  
  17. print_r(json_encode(array('success'=>'存在数据,返回')));
  18.  
  19. exit(); //输出数据,退出。然后客户端不间断继续发起请求
  20.  
  21. }
  22.  
  23. //数据不存在,继续循环。
  24.  
  25. }
  26.  
  27. ?>

  

长轮询的精髓就在于Ajax的回调函数,继续再次调用Ajax请求(不间断的原理就在这里,成功返回后立即再次调用):

$.ajax(getting);

类似于js里面的递归,在函数里面调用函数;

最关键的地方在于前一次请求结束后,第二次请求立即不间断的发起,这个就叫做Ajax长轮询

ajax的轮询和长轮询的更多相关文章

  1. 浅谈Websocket、Ajax轮询和长轮询(long polling)

    浅谈Websocket.Ajax轮询和长轮询(long p0ll) 最近看到了一些介绍Websocket的文章,觉得挺有用,所以在这里将自己的对其三者的理解记录一下. 1.什么是Websocket W ...

  2. 轮询、长轮询与Web Socket的前端实现

    Web Socket 应用场景:实现即时通讯:如股票交易行情分析.聊天室.在线游戏等,替代轮询和长轮询 轮询 轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP request,然后由 ...

  3. 轮询、长轮询、长连接、websocket

    Web端即时通讯技术:即时通讯技术简单的说就是实现这样一种功能:服务器端可以即时地将数据的更新或变化反应到客户端,例如消息即时推送等功能都是通过这种技术实现的.但是在Web中,由于浏览器的限制,实现即 ...

  4. 你想了解的轮询、长轮询和websocket都在这里了

    日常生活中,有很多需要数据的实时更新,比如群聊信息的实时更新,还有投票系统的实时刷新等 实现的方式有很多种,比如轮询.长轮询.websocket 轮询 轮询是通过设置页面的刷新频率(设置多长时间自动刷 ...

  5. Python知识之 方法与函数、偏函数、轮询和长轮询、流量削峰、乐观锁与悲观锁

    方法与函数 函数需要手动传参self.cls,方法自动传,比如对象方法自动传self,类方法自动传cls,而函数相对而言需要手动传,比如静态绑定的函数,self是需要手动传值得,比如我们平常使用的函数 ...

  6. WebSocket知识、轮询、长轮询、长连接

    一.WebSocket理论知识 1.什么是websocket WebSocket是HTML5新增的协议,它的目的是在浏览器和服务器之间建立一个不受限的双向通信的通道,比如说,服务器可以在任意时刻发送消 ...

  7. http轮询,长轮询

    轮询,长轮询 轮询 轮询:客户端定时向服务器发送Ajax请求,服务器接到请求后马上返回响应信息并关闭连接. 优点:后端程序编写比较容易. 缺点:请求中有大半是无用,浪费带宽和服务器资源. 实例:适于小 ...

  8. HTTP协议中的短轮询、长轮询、长连接和短连接

    HTTP协议中的短轮询.长轮询.长连接和短连接 引言 最近刚到公司不到一个月,正处于熟悉项目和源码的阶段,因此最近经常会看一些源码.在研究一个项目的时候,源码里面用到了HTTP的长轮询.由于之前没太接 ...

  9. HTTP协议中的短轮询、长轮询、长连接和短连接,看到一篇文章有感

    关于短轮询.长轮询 短轮询主要是前端实现,JS写个死循环,不停的去请求服务器中的库存量是多少,然后刷新到这个页面当中,这其实就是所谓的短轮询. 长轮询主要取决于服务器,在长轮询中,服务器如果检测到数据 ...

  10. 轮询、长轮询、websock

    引入 Web端即时通讯技术:即时通讯技术简单的说就是实现这样一种功能:服务器端可以即时地将数据的更新或变化反应到客户端,例如消息即时推送等功能都是通过这种技术实现的.但是在Web中,由于浏览器的限制, ...

随机推荐

  1. Redis全方位讲解--哨兵模式(Sentinel模式)(转载)

    前言 当按照上一篇<redis主从复制>部署好之后,我们会想,一旦redis的master出现了宕机,并且我们并没有及时发现,这时候就可能会出现数据丢失或程序无法运行.此时,redis的哨 ...

  2. 我使用过的Linux命令之clear - 清除终端屏幕,不是cls

    原文链接:http://codingstandards.iteye.com/blog/804213 用途说明 clear命令是用来清除终端屏幕的(clear the terminal screen), ...

  3. java遍历实体类的属性和数据类型以及属性值

    遍历实体类的树形和数据类型一级属性值 /** * 遍历实体类的属性和数据类型以及属性值 * @param model * @throws NoSuchMethodException * @throws ...

  4. unity5, import fbx注意事项

    一,模型尺寸. unity中是以米为单位,要想让3dmax中建的模型导入到unity中与unity自带的3d object尺寸一致,最直接的办法是将3dmax中的系统单位也设成米. 菜单->自定 ...

  5. SMBus总线概述

    1.概述: 系统管理总线是一种两线制接口.它基于I2C 总线原理演变而来,可以认为是简化版的I2C总线. SMBus最初是应用到智能电池,如电池充电器和一个微控制器.其提供一个系统和电源管理相关的任务 ...

  6. JS 利用正则表达式替换字符串

    JS 利用正则表达式替换字符串 博客分类: JavaScript 学习资料 Java代码 收藏代码 JS 利用正则表达式替换字符串 var data = "123123,213,12312, ...

  7. swift 继承和构造器

    继承 class Vehicle { var numberOfWheels: Int var maxPassengers: Int func description() -> String { ...

  8. 解决:Scanner输入数字总是莫名其妙多个0

    用BufferedInputStream解决 Scanner scanner = new Scanner(new BufferedInputStream(System.in)); System.out ...

  9. C# TextBox常用方法总结

    我们在使用C# TextBox进行开发操作的时候经常会碰到C# TextBox的使用,那么C# TextBox的使用有没有一些常用的技巧呢?如C# TextBox换行的处理,其实就是一些常用的操作,那 ...

  10. MySQL 使用 SSL 连接(附 Docker 例子)

    查看是否支持 SSL 首先在 MySQL 上执行如下命令, 查询是否 MySQL 支持 SSL: mysql> SHOW VARIABLES LIKE 'have_ssl'; +-------- ...