当前位置: 首页 > news >正文

前端(二十三)——轮询和长轮询

在这里插入图片描述

😫博主:小猫娃来啦
😫文章核心:实现客户端与服务器实时通信的技术手段

文章目录

  • 前言
  • 轮询技术
    • 轮询的概念
    • 轮询的实现原理
    • 轮询的优缺点
    • 轮询的使用场景
  • 长轮询技术
    • 长轮询的概念
    • 长轮询的实现原理
    • 长轮询的优缺点
    • 长轮询的使用场景
  • 轮询与长轮询的比较
  • 示例代码
  • 结论

前言

现代Web应用程序对实时通信的需求越来越高,为了满足这种需求,轮询和长轮询成为了常用的技术手段。本文将深入探讨轮询和长轮询的实现原理、优缺点以及使用场景,并提供代码示例,以帮助读者更好地理解和应用这两种技术。


轮询技术

轮询的概念

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

轮询的实现原理

轮询的实现原理很简单,客户端期发送HTTP请求给服务器并等待响应。客户端可以使用定时器来定期发送请求,通常间隔时间设置为几秒钟到几分钟。服务器收到请求后检查是否有新数据或事件,并将其返回给客户端作为响应。客户端收到响应后,处理数据或事件,并随后发送下一个请求。

// 客户端代码
function pollServer() {fetch('/api/data').then(response => response.json()).then(data => {// 处理服务器响应的数据console.log('Received data:', data      // 继续下一次轮询setTimeout(pollServer, 5000);});
}// 开始轮询
pollServer();
// 服务器端代码 (使用 Express 框架)
const express = require('express');
const app = expressapp.get('/api/data', (req, res) => {// 假设需要返回的数据为 { "status": "ok", "data": ... }const responseData = {status: 'ok',data: ... // 根据实际需求提供数据};res.json(responseData);
});app.listen(3000, () => {console.log('Server is running on port 3000');
});

轮询的优缺点

轮询的优点是简单易实现,适用于各种浏览器和服务器。然而,由于轮询的定期发送请求的特性,它会产生不必要的网络流量和延迟,并对服务器和客户端资源造成额外的负担。

轮询的使用场景

轮询适用于不需要实时性的应用场景,例如在线聊天室、实天气更新等。在这些场景下,短暂的延迟不会对用户体验产生重大影响。


长轮询技术

长轮询的概念

长轮询是一种改进的轮询技术,其主要目的是降低轮询过程中的资源消耗和延迟。长轮询的基本原理是客户端发送一个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
// 服务器端代码 (使用 Express 框架)
const express = require('express');
const app = express();let newData = null;app.get('/api/data', (req, res) => {if (newData === null) {// 服务器新数据或事件,返回204res.sendStatus(204);} else    // 服务器有新数据或事件,返回200和数据res.json(newData);newData = null;}
});// 更新数据或的路由,此处为示例代码,根据实际求进行修改
app.post('/api', (req, res) => {// 更新服务器的数据或事件newData = {... // 根实际需求更新数据或事件};// 返回响应res.sendStatus(200);
});app.listen(3000, () => {console.log('Server is running on port3000');
});

长轮询的优缺点

长轮询相较于轮询技术来说,减少了不必要的网络流量和请求次数,降低了服务器和客户端的资源消耗。但是相对于传统的轮询技术,长轮询的实现更加复杂,并且需要服务器支持长时间保持连接的能力。

长轮询的使用场景

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


轮询与长轮询的比较

轮询和长轮询都是实现实时通信的有效技术手段,但两者在资源消耗、延迟和实时性等方面有所不同。下表总结了两者的比较:

特性轮询长轮询
资源消耗
延迟较高较低
实时性较低较高
实现难度简单复杂

示例代码

下面是一个使用轮询实现实时时间更新的简单示例代码:

// 客户端代码
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();
# 服务器端代码 (使用Flask框架)
import datetime
from flask import Flask, jsonifyapp = Flask(__name__)@app.route('/api/time')
def get_time():# 返回服务器当前的时间return jsonify({'time': datetime.datetime.now()})if __name__ == '__main__':app.run()

结论

轮询和长轮询都是实现客户端与服务器实时通信的技术手段,它们在资源消耗、延迟和实时性等方面存在差异。轮询适用于不需要实时性要求很高的场景,而长轮询适用于对实时性要求较高的场景。根据具体的应用需求和系统资源情况,选择合适的实时通信技术可以提供更好的用户体验和系统性能。

在这里插入图片描述


相关文章:

前端(二十三)——轮询和长轮询

😫博主:小猫娃来啦 😫文章核心:实现客户端与服务器实时通信的技术手段 文章目录 前言轮询技术轮询的概念轮询的实现原理轮询的优缺点轮询的使用场景 长轮询技术长轮询的概念长轮询的实现原理长轮询的优缺点长轮询的使用场景 轮询与…...

uniapp把文件中的内复制到另一个文件中

使用的是Html 5的plus.io.resolveLocalFileSystemURL方法,文档:HTML5 API Reference var soursePath file:///storage/emulated/0/a/;//用于读取var removePath file:///storage/emulated/0/w/;//用于移除w这个文件夹var targetPath file:///storage/…...

什么是蓝桥杯?什么是蓝桥STEMA考试?

第十五届蓝桥大赛赛事安排? STEMA考试11月(考试时间11月26日) STEMA考试1月(2024年1月) STEMA考试3月(2024年3月) 第十五届蓝桥杯省赛(2024年4月待定) 第十五届蓝桥杯国赛(2024年5月待定) 注:以上时间具体以组委会官方发布为准。 01.蓝桥杯 蓝桥杯全国软件和…...

快递排序Java

快速排序是在工具类常用的排序算法,快速排序的思想主要是选定一个基准元素,然后找到基准元素的位置,然后再分别排序他左边的和他右边的,快速排序是不稳定的,时间复杂度位Nlog(N),最极端的情况就是一个反向排好顺序的数组&#xff…...

Spark简单回顾

星光下的赶路人star的个人主页 大鹏一日同风起,扶摇直上九万里 文章目录 1、Spark1.1 Spark入门1.1.1 Spark部署模式1.1.2 常用端口 1.2 SparkCore1.2.1 RDD不可变和五大属性1.2.2 RDD的弹性1.2.3 cache和Checkpoint的区别1.2.4 算子 1.3 SparkSQL1.4 内核1.4.1提交…...

DDD与微服务的千丝万缕

一、软件设计发展过程二、什么是DDD?2.1 战略设计2.2 战术设计2.3 名词扫盲1. 领域和子域2. 核心域、通用域和支撑域3. 通用语言4. 限界上下文5. 实体和值对象6. 聚合和聚合根 2.4 事件风暴2.5 领域事件 三、DDD与微服务3.1 DDD与微服务的关系3.2 基于DDD进行微服务…...

S32K324 UDS Bootloader开发-需求篇

文章目录 前言内存分配UDS诊断协议需求CAN ID及时间参数UDS诊断服务Bootloader诊断服务APP诊断服务 DID22服务的DID:2E服务的DID:Routine Control DID: 刷写流程预编程主编程后编程 总结 前言 之前做过一个STM32的UDS Bootloader,协议栈主要是NXP官网下…...

【前端设计模式】之调停者模式(中介者模式)

调停者模式是一种行为设计模式,它通过引入一个调停者对象来集中处理一组对象之间的交互。调停者模式的目标是减少对象之间的直接通信,从而降低耦合度,并且使代码更易于维护和扩展。 调停者模式特性 将对象之间的通信集中在一个调停者对象中…...

【MySQL架构篇】SQL执行流程与缓冲池

文章目录 1. SQL执行流程2. 数据库缓冲池(Buffer Pool)2.1 缓冲池概述2.2 缓冲池如何读取数据2.3 查看和设置缓冲池的大小2.4 多个Buffer Pool实例2.5 引申问题 1. SQL执行流程 查询缓存:因为查询效率往往不高,所以在MySQL8.0之后就抛弃了这个功能解析器…...

[support2022@cock.li].faust、[tsai.shen@mailfence.com].faust勒索病毒数据怎么处理|数据解密恢复

引言: 威胁网络安全的恶意软件不断涌现,而[support2022cock.li].faust勒索病毒则是其中的一员。这个网络黑暗角落的新星,以其数据绑架的方式,一度成为数据安全的威胁焦点。本文将探究[support2022cock.li].faust勒索病毒的运作方…...

力扣学习笔记——49. 字母异位词分组

49. 字母异位词分组 https://leetcode.cn/problems/group-anagrams/?envTypestudy-plan-v2&envIdtop-100-liked 给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。…...

五、Qt中的常用类

1. QString 字符串类 QString是Qt中的字符串类,与C/C不同的是,不再使用ASCII编码,而使用Unicode编码。因此一个字符不是8位的char,而是16位的QChar,这就是为什么之前一个汉字占用一个字符的原因。、 QString几乎向前兼…...

CentOS 7.9.2009 数据盘挂载

一、linux版本: lsb_release -a 二、操作步骤 2.1,查看磁盘挂载情况,确认sdb是需挂载的硬盘 ## 查看磁盘挂载情况,确认sdb是需挂载的硬盘 lsblk 2.2,对硬盘sdb进行分区 ## 对硬盘sdb进行分区 fdisk /dev/sdb# 命令…...

cv::solvePnP使用方法及注意点详解(OpenCV/C++)

cv::solvePnP(objectPoints, imagePoints, cameraMatrix, distCoeffs, rvec, tvec, useExtrinsicGuess, flags); 1、参数说明&#xff1a; objectPoints&#xff1a;一个 vector<cv::Point3f>&#xff0c;包含了在世界坐标系中的三维点的坐标&#xff0c;至少需要4个点…...

DevOps持续集成-Jenkins(4)

❤️作者简介&#xff1a;2022新星计划第三季云原生与云计算赛道Top5&#x1f3c5;、华为云享专家&#x1f3c5;、云原生领域潜力新星&#x1f3c5; &#x1f49b;博客首页&#xff1a;C站个人主页&#x1f31e; &#x1f497;作者目的&#xff1a;如有错误请指正&#xff0c;将…...

【数据仓库-零】数据仓库知识体系 ing

文章目录 一. 数仓基本概念二. 离线数仓建设方法论三. etl流程四. 数仓规范建设指南四. 数据仓库架构五. 数据可视化 通过熟悉构建数仓整体的过程&#xff0c;可以系统的了解 数仓构建理论&#xff1a;能够站在全局角度看数仓的运行架构&#xff0c;数仓执行流程。了解到构建数…...

css3 3D 转换 技巧详细解析与代码实例

CSS3 3D转换是CSS3中的一项新特性&#xff0c;通过它我们可以比较容易地实现3D效果。在这里&#xff0c;我将向大家介绍CSS3 3D转换的一些基本概念、使用方法和常见技巧。 1. 基本概念 在使用CSS3 3D转换时&#xff0c;需要了解一些基础概念&#xff1a; 三维坐标系&#xf…...

[Unity]给场景中的3D字体TextMesh增加描边方案一

取你的文本对象&#xff0c;简单地添加以下脚本: using UnityEngine; using System.Collections; using UnityEngine.UI;public class TextOutline : MonoBehaviour {public float pixelSize 1;public Color outlineColor Color.black;public bool resolutionDependant fal…...

TDengine(taos)数据库导出历史数据

业务需求&#xff1a;导出某个站点的累计充电量&#xff0c;累计放电量&#xff0c;光伏总放电量&#xff0c;进线总功率的所有数据‘ 1、登录taos&#xff0c;使用存数据的库&#xff1b; 提示Database changed&#xff1b;即为使用成功&#xff1b; 2、找到你想要导出的字段…...

算法进修Day-37

算法进修Day-37 73. 矩阵置零 难度&#xff1a;中等 题目要求 给定一个 _m_ x _n_ 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例1 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[…...

ContextMenuManager:3步实现Windows右键菜单精准管理的开源解决方案

ContextMenuManager&#xff1a;3步实现Windows右键菜单精准管理的开源解决方案 【免费下载链接】ContextMenuManager &#x1f5b1;️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager Windows右键菜单是操作系统中最频…...

基于 HarmonyOS 6.0 的家政服务预约页面实战开发:ArkUI 页面构建与跨端设计深度解析

基于 HarmonyOS 6.0 的家政服务预约页面实战开发&#xff1a;ArkUI 页面构建与跨端设计深度解析 前言 随着 HarmonyOS 生态逐渐成熟&#xff0c;HarmonyOS NEXT 与 HarmonyOS 6.0 的持续推进&#xff0c;越来越多开发者开始从传统 Android、Flutter、Web 技术栈逐步迁移到鸿蒙原…...

别再死记硬背物联网四层架构了!用LoRa和ESP32手把手搭个智能花盆,实战理解每一层

从智能花盆实战理解物联网四层架构&#xff1a;LoRaESP32全流程拆解 每次翻开物联网教材&#xff0c;总能看到那个经典的四层架构图&#xff1a;感知层、网络层、平台层、应用层。但真正动手做项目时&#xff0c;却发现理论和实践之间隔着一道鸿沟。今天我们就用最接地气的方式…...

机器人企业如何用 CRM 优化线索、商机与客户管理

对于机器人、工业自动化和智能制造解决方案企业而言&#xff0c;销售管理往往不是简单的客户跟进&#xff0c;而是围绕复杂需求、技术方案、项目周期和多角色协作展开的长期过程。Zoho CRM 的价值&#xff0c;正是在于帮助这类 B2B 企业把线索管理、商机推进、客户需求沉淀和销…...

主从结合,安全互联:Anybus工业通信解决方案全栈升级

HMS亮相2026 PROFINET技术路演杭州站&#xff0c;展出全新Anybus SoM及全栈PROFINET方案&#xff0c;助力设备商应对CRA与机械法规双重合规挑战。 5月14日&#xff0c;由PI China主办的2026 PROFINET技术路演&#xff08;杭州站&#xff09;在西玥酒店圆满举行。HMS华东区OEM销…...

【MATLAB源码-第439期】基于MATLAB的APSK与QAM高阶调制在Saleh非线性功放下BER和EVM性能对比

操作环境&#xff1a;MATLAB 2024a1、算法描述摘要 高阶数字调制技术是现代无线通信和卫星通信系统提高频谱利用率的重要方法。QAM 调制通过同相分量和正交分量的幅度组合形成二维星座&#xff0c;在较高信噪比条件下能够获得较高的信息承载能力。APSK 调制则采用多环幅相结构&…...

CTFSHOW-WEB入门(1)信息收集

web1f12得到flagweb2虽然f12不能打开&#xff0c;但是curlU就直接开了得到flag也可以在url前面加个view-source&#xff0c;效果一样也可以通过浏览器打开开发者工具web3没思路的时候抓个包看看&#xff0c;可能会有意外收获得到flagweb4总有人把后台地址写入robots&#xff0c…...

std::accumulate算法深度解析:从求和到通用折叠,解锁STL隐藏的瑞士军刀

1. 重新认识std::accumulate&#xff1a;不只是求和工具 第一次接触std::accumulate时&#xff0c;大多数人都是从求和开始的。确实&#xff0c;这个算法默认行为就是对范围内的元素进行累加。但如果你只把它当作一个高级计算器&#xff0c;那就太小看这个STL中的"瑞士军刀…...

工业作业火花识别 工业作业安全监测 工业安全火灾识别 火灾烟雾识别

火灾、烟雾及火花检测数据集 数据集概述 本数据集面向计算机视觉目标检测场景构建&#xff0c;聚焦火情风险要素识别&#xff0c;为烟火火花类智能监测模型训练提供标准化图像数据支撑&#xff0c;整体适配深度学习目标检测算法训练、验证与测试流程&#xff0c;可有效支撑安防…...

2026四大主流收银系统深度横评:商拓、柚子、商琦云与银阁仕实战对比

在零售和餐饮行业数字化转型的浪潮中&#xff0c;收银系统早已超越了简单的“算账工具”范畴&#xff0c;成为了门店运营的中枢神经。很多店主在选型时容易陷入一个误区&#xff1a;只盯着硬件价格或者界面好不好看&#xff0c;却忽略了系统在高峰期的稳定性、数据链路的打通能…...