轮询和长轮询的讲解和实战

这篇具有很好参考价值的文章主要介绍了轮询和长轮询的讲解和实战。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

当今web应用程序对实时通信的需求越来越高,为了满足客户需求,轮询和长轮询成为常用的技术手段。本文将深入讲解一下轮询实现原理、优缺点和使用场景。

一、轮询概念

轮询是一种客户端与服务器之间实时通信的技术手段。
基本原理:客户端定期发送请求来查询服务器是否有新数据或事件,并将响应返回给客户端。如果服务器有新的数据或事件,则将其返回给客户端;如果没有,则返回一个空响应。客户端收到响应后,可以处理数据或事件,并根据需要继续发送下一个请求。

定义:轮询是指在一定的时间间隔内,定时向服务器发送请求,获取最新数据的过程。轮询通常用于从服务器获取实时更新的数据。

// 客户端代码
function pollServer() {
  fetch('/api/data')
    .then(response => response.json())
    .then(data => {
      // 处理服务器响应的数据
      console.log('Received data:', data      // 继续下一次轮询
      setTimeout(pollServer, 5000);
    });
}

// 开始轮询
pollServer();


二、轮询的优缺点

优点:简单易实现,适用于各种浏览器和服务器。

缺点:轮询会产生大量的无效请求,浪费带宽和服务器资源,产生不必要的网络流量和延迟,并对服务器和客户端资源造成额外的负担。同时,在短时间内频繁地发送请求可能会被服务器视为恶意行为,导致 IP 被封禁等问题

注:轮询适用于不需要实时性的应用场景

三、长轮询概念

长轮询是一种改进的轮询技术,其主要目的是降低轮询过程中的资源消耗和延迟。长轮询的基本原理是客户端发送一个HTTP请求给服务器,并保持连接打开,直到服务器有新的数据或事件时才返回响应给客户端。在这期间,服务器会一直保持连接打开,直到超时或有新数据或事件

// 客户端代码
function longPollServer() {
  fetch('/api/data')
    .then(response => {
      if (response.status === 204) {
        // 服务器返回204表示没有新数据或事件,继续进行长轮询
        longPollServer();
      } else if (response.status === 200) {
        // 服务器返回200表示有新数据或事件,处理数据并进行下一次长轮询
        response.json().then(data => {
          console.log('Received data:', data);

          // 继续进行长轮询
          longPollServer();
        });
      }
    });
}

//开始长轮询
longPollServer

四、长轮询的优缺点

优点:长轮询相较于轮询技术来说,减少了不必要的网络流量和请求次数,降低了服务器和客户端的资源消耗

缺点:相对于传统的轮询技术,长轮询的实现更加复杂,并且需要服务器支持长时间保持连接的能力。

注:长轮询适用于对实时性要求较高的应用场景,例如在线游戏、即时消息推送等。在这些场景下,降低延迟和减少不必要的资源消耗对于提供良好的用户体验非常重要。

五、轮询和长轮询的区别比较

轮询和长轮询都是实现客户端与服务器实时通信的技术手段,它们在资源消耗、延迟和实时性等方面存在差异。
轮询是在固定的时间间隔内向服务器发送请求,即使服务器没有数据更新也会继续发送请求(不需要实时性要求很高的场景)
长轮询是先发送一个请求,服务器如果没有数据更新,则不会立即返回,而是将请求挂起,直到有数据更新时再返回结果(对实时性要求较高的场景)。

轮询和长轮询的讲解和实战,javascript,前端

六、示例代码

案例1:使用轮询实现实时时间更新的简单示例代码:

// 客户端代码
function pollServer() {
  发送HTTP请求给服务器
  fetch('/api/time')
    .then(response => response.json())
    .then(data => {
      // 处理服务器响应的时间数据
      const currentTime = new Date(data.time);
      document.getElementById('time').innerText = currentTime.toLocaleTimeString();

      // 继续下一次轮询
      setTimeout(pollServer, 5000);
    });
}

// 开始轮询
pollServer();

案例2:可视化动态展示数据,有的需要十秒轮询请求一次,有的需要3分钟请求一次,有的需要一天一次(顺便加一个定时,每天几点钟定时请求一次)文章来源地址https://www.toymoban.com/news/detail-806168.html

<template>
  <div class="echart">
  </div>
</template>

<script>

export default {
 data() {
   return {
    num_0:0,
    num_1:0,
    num_2:0,
   timer_10: null,//10S短轮询
   timer_3: null,  //3分钟短轮询
   timer_24: null,  //24小时长轮询

  };
 },
  destroyed() {
   //离开页面是时记得销毁
    this.clearAll()
  },
  created() {
    // 进入页面开始请求
    this.getShotList3()
    this.getShotList10()
    this.getLongList()
    // 开启定时
    this.startRequest()
 },
  methods: {
    startRequest() {
      //10S短轮询:组合使用setInterval setTimeout实现轮询可解决浏览器崩溃
      this.timer_10 = window.setInterval(() => {
        setTimeout(this.getShotList10(), 0);
      },10000);
      // 3分钟短轮询
      this.timer_3 = window.setInterval(() => {
        setTimeout(this.getShotList3(), 0);
      }, 180000);
      // 每日一次的轮询:每日定点7点查询一次;计算当前时间和目标时间的时间间隔,如果超过,则设置定时查询的时间间隔为距离明天目标小时的距离,如果还没到就设置时间为当前时间到目标小时的距离。
       this.setRegular(7);
    },
    setRegular(targetHour) {
      let nowTime = new Date()
      let nowSeconds = nowTime.getHours() * 3600 + nowTime.getMinutes() * 60 + nowTime.getSeconds()        // 计算当前时间的秒数
      let targetSeconds =  targetHour * 3600  // 计算目标时间对应的秒数
      // 判断是否已超过今日目标钟点数,若超过,时间间隔设置为距离明天目标小时的距离
      let timeInterval = targetSeconds > nowSeconds ? targetSeconds - nowSeconds: targetSeconds + 24 * 3600 - nowSeconds
      this.timer_24 = window.setInterval(() => {
        setTimeout(this.getLongList(), 0)
        }, timeInterval * 1000);
    },
    getLongList() {
      console.log("24小时轮询" + this.num_0++ + "次");

    },
    clearAll() {
      clearInterval(this.timer_10);
      clearInterval(this.timer_3);
      clearInterval(this.timer_24);
      this.timer_10 = null;
      this.timer_3 = null;
      this.timer_24 = null;
      console.log('销毁');
    },
    // 10S的短轮询 数据全部拿到之后在进行下一次请求
    getShotList10() {
      console.log("10秒钟请求" + this.num_1++ + "次");
    },
   // 3分钟的短轮询 数据全部拿到之后在进行下一次请求
    getShotList3() {
      console.log("3分钟请求" + this.num_2++ + "次");
   },
}

}
</script>

<style  scoped>
.echart{
	width:100%;
	height:100%
}

</style>


到了这里,关于轮询和长轮询的讲解和实战的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 轮询的时候,总是报500服务器无法处理大量的请求

    HTTP 500 错误通常表示服务器内部错误。这意味着后端服务器出现了一些问题,导致它无法处理请求。如果你在调用任务状态的接口时总是遇到这个错误,可能有以下一些原因: 1.后端代码出现了错误,导致服务器无法正确处理请求。你可以查看服务器的日志,找出具体的错误

    2023年04月14日
    浏览(69)
  • 即时通讯:短轮询、长轮询、SSE 和 WebSocket 间的区别

    在现代 Web 开发中,即时通讯已经成为许多应用程序的重要组成部分。为了实现即时通讯,开发人员通常使用不同的技术和协议。本文将介绍四种常见的即时通讯实现方法:短轮询、长轮询、SSE(服务器发送事件)和 WebSocket,并探讨它们之间的区别。 短轮询是最简单的即时通

    2024年02月12日
    浏览(29)
  • IM通信技术快速入门:短轮询、长轮询、SSE、WebSocket

    🎉IM通信技术快速入门:短轮询、长轮询、SSE、WebSocket ☆* o(≧▽≦)o *☆嗨~我是IT·陈寒🍹 ✨博客主页:IT·陈寒的博客 🎈该系列文章专栏:Java面试技巧 📜其他专栏:Java学习路线 Java面试技巧 Java实战项目 AIGC人工智能 数据结构学习 🍹文章作者技术和水平有限,如果文中

    2024年02月05日
    浏览(30)
  • Tomcat长轮询原理与源码解析

    系列文章目录和关于我 最近在看工作使用到的配置中心原理,发现大多数配置中心在推和拉模型上做的选择出奇的一致选择了 基于长轮询的拉模型 基于拉模型的客户端轮询的方案 客户端通过轮询方式发现服务端的配置变更事件。轮询的频率决定了动态配置获取的实时性。

    2023年04月16日
    浏览(24)
  • AsyncContext优雅实现HTTP长轮询接口

    接到一个需求,实现方案时需要提供一个HTTP接口,接口需要hold住5-8秒,轮询查询数据库,一旦数据库中值有变化,取出变化的值进行处理,处理完成后返回响应。这不就是长轮询吗,如何优雅的实现呢? 在这之前先简单介绍下长连接和短连接 HTTP长链接(Keep-Alive) 概念:

    2024年02月09日
    浏览(27)
  • RocketMQ的长轮询(Long Polling)实现分析

    目录 前言 长轮询 1.实现步骤 1.1客户端轮询发送请求 1.2服务端处理数据 1.3客户端接收数据 2.实现实例 RocketMQ长轮询 1.PullMessage服务 2.PullMessageProcessor服务 3.PullCallback回调 总结 消息队列一般在消费端都会提供push和pull两种模式,RocketMQ同样实现了这两种模式,分别提供了两个实

    2024年02月07日
    浏览(26)
  • javascript中轮询一个接口的方法,setInterval和setTimeout + 递归、requestAnimationFrame

    轮询:就是定时重复请求一个接口,比如,我们想要知道一个订单的状态,就需要轮训订单状态的接口,查询到我们想要的结果 (支付成功或者失败) 就终止轮询。 方法一:setInterval 这个方法我们一般都能想到,用法很简单,但是这种方法,如果我们忘记了清空定时器就会导

    2024年02月16日
    浏览(38)
  • nginx配置负载均衡--实战项目(适用于轮询、加权轮询、ip_hash)

    👨‍🎓 博主简介   🏅云计算领域优质创作者   🏅华为云开发者社区专家博主   🏅阿里云开发者社区专家博主 💊 交流社区: 运维交流社区 欢迎大家的加入! 🐋 希望大家多多支持,我们一起进步!😄 🎉如果文章对你有帮助的话,欢迎 点赞 👍🏻 评论 💬 收藏

    2024年02月08日
    浏览(29)
  • springboot业务功能实战(四)告别轮询,websocket的集成使用

    org.springframework.boot spring-boot-starter-websocket 加入配置类 @Configuration public class WebSocketConfig { /** 注入ServerEndpointExporter, 这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint */ @Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); } } 加入连接发送消

    2024年04月15日
    浏览(39)
  • 【JavaScript】讲解JavaScript的基础知识并且配有案例讲解

    🎊专栏【 前端易错合集】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【如愿】 大一同学小吉,欢迎并且感谢大家指出我的问题🥰 目录   🎁JavaScript嵌入网页的方式 🍔alert(\\\"这是一个JavaScript例子\\\");     (或者window.alert()) 🍔 document.write(\\\"这是一个Jav

    2024年02月08日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包