前端(二十三)——轮询和长轮询
😫博主:小猫娃来啦
😫文章核心:实现客户端与服务器实时通信的技术手段
文章目录
- 前言
- 轮询技术
- 轮询的概念
- 轮询的实现原理
- 轮询的优缺点
- 轮询的使用场景
- 长轮询技术
- 长轮询的概念
- 长轮询的实现原理
- 长轮询的优缺点
- 长轮询的使用场景
- 轮询与长轮询的比较
- 示例代码
- 结论
前言
现代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),最极端的情况就是一个反向排好顺序的数组ÿ…...

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、参数说明: objectPoints:一个 vector<cv::Point3f>,包含了在世界坐标系中的三维点的坐标,至少需要4个点…...

DevOps持续集成-Jenkins(4)
❤️作者简介:2022新星计划第三季云原生与云计算赛道Top5🏅、华为云享专家🏅、云原生领域潜力新星🏅 💛博客首页:C站个人主页🌞 💗作者目的:如有错误请指正,将…...
【数据仓库-零】数据仓库知识体系 ing
文章目录 一. 数仓基本概念二. 离线数仓建设方法论三. etl流程四. 数仓规范建设指南四. 数据仓库架构五. 数据可视化 通过熟悉构建数仓整体的过程,可以系统的了解 数仓构建理论:能够站在全局角度看数仓的运行架构,数仓执行流程。了解到构建数…...
css3 3D 转换 技巧详细解析与代码实例
CSS3 3D转换是CSS3中的一项新特性,通过它我们可以比较容易地实现3D效果。在这里,我将向大家介绍CSS3 3D转换的一些基本概念、使用方法和常见技巧。 1. 基本概念 在使用CSS3 3D转换时,需要了解一些基础概念: 三维坐标系…...
[Unity]给场景中的3D字体TextMesh增加描边方案一
取你的文本对象,简单地添加以下脚本: 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)数据库导出历史数据
业务需求:导出某个站点的累计充电量,累计放电量,光伏总放电量,进线总功率的所有数据‘ 1、登录taos,使用存数据的库; 提示Database changed;即为使用成功; 2、找到你想要导出的字段…...
算法进修Day-37
算法进修Day-37 73. 矩阵置零 难度:中等 题目要求 给定一个 _m_ x _n_ 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例1 输入:matrix [[1,1,1],[1,0,1],[1,1,1]] 输出:[…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

抽象类和接口(全)
一、抽象类 1.概念:如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象,这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法,包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中,⼀个类如果被 abs…...
0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化
是不是受够了安装了oracle database之后sqlplus的简陋,无法删除无法上下翻页的苦恼。 可以安装readline和rlwrap插件的话,配置.bahs_profile后也能解决上下翻页这些,但是很多生产环境无法安装rpm包。 oracle提供了sqlcl免费许可,…...

Linux 下 DMA 内存映射浅析
序 系统 I/O 设备驱动程序通常调用其特定子系统的接口为 DMA 分配内存,但最终会调到 DMA 子系统的dma_alloc_coherent()/dma_alloc_attrs() 等接口。 关于 dma_alloc_coherent 接口详细的代码讲解、调用流程,可以参考这篇文章,我觉得写的非常…...