前端(二十四)——轮询与 WebSocket的battle

news2024/9/23 1:24:39

在这里插入图片描述
😃博主:小猫娃来啦
😃文章核心:轮询与 WebSocket的battle

文章目录

  • 前言
  • 轮询的原理及实现
  • WebSocket的原理及实现
  • 轮询与WebSocket的比较
  • 轮询的应用场景
  • WebSocket的应用场景
  • 使用场景的对比与选择
  • WebSocket的安全性考虑
  • WebSocket与服务器端推送技术的比较

前言

在现代Web应用中,实时通信已经成为用户体验的重要组成部分。实时通信指的是通过网站或应用程序实时传输数据并保持连接,在无需手动刷新页面的情况下更新内容。轮询和WebSocket都是用于现实时通信的技术。今天我们来对比一下这两种实现方式,看看到底哪个好。


轮询的原理及实现

什么是轮询
轮询是一种客户端不断向服务器发送请求以获取更新的数据的方式。客户端定期(通常使用定时器)向服务器发送请求,不管服务器是否有新数据。如果服务器没有更新,服务器返回空或者相同的响;如果有新数据,服务器会返回最新的数据。

轮询的工作原理
轮询的工作原理很简单。客户端发起请求,服务器检查是否有新数据。如果有,服务器返回数据;如果没有,服务器等待一段时间,然后返回空响应。客户端接收到响应后,再次发起请求,继续这个过程。

轮询的实现方式
轮询有两种常见的实现方式:定时轮询和递归轮询。定时轮询是设置一个固定的时间隔,每隔一段时间就发送一次请求;递归轮询是在每次请求的回调函数中再次发送请求。

以下是一个使用JavaScript的定时轮询示例:

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

// 开始轮询
pollServer();

WebSocket的原理及实现

什么是WebSocket
WebSocket是一种全双工、持久化的通信协议,可以在客户端和服务器之间建立实时的双向通信。与传统的HTTP请求-响应模型不同,WebSocket允许服务器主动向客户端推送数据,而不需要客户端不断发送请求。

WebSocket的工作原理
WebSocket的工作原理基于HTTP协议的升级。客户端向服务器发送一个特殊的Upgrade请求头,服务器收到请求后,如果支持WebSocket协议,将响应101 Switching Protocols,并将连接升级为全双工通信的WebSocket连接。之后,服务器和客户端都可以通过这个连接进行实时的双向通信。

WebSocket的实现方式
在前端,你可以使用WebSocket API与服务器建立WebSocket连接,并通过发送和接收消息来实现实时通信。在服务器端,你需要使用相应的后端框架或库来处理WebSocket连接和消息。

以下是一个使用JavaScript的WebSocket示例:

const socket = new WebSocket('ws://example.com/socket');

socket.onopen = function() {
  console.log('WebSocket connection established.');
};

socket.onmessage = function(event) {
  const data = event.data;
  // 处理收到的数据
  console.log('Received data:', data);
};

socket.onerror = function(error) {
  console.error('WebSocket error:', error);
};

socket.onclose = function() {
  console.log('WebSocket connection closed.');
};

以上代码示例中,我们创建了一个WebSocket对象,并通过监听事件来处理连接的建立、收到的数据、错误和连接关闭。


轮询与WebSocket的比较

性能比较
性能方面,WebSocket比轮询具有明显的优势。因为WebSocket使用持久化连接,不需要在每个请求中发送额外的头信息,减少了网络传输的开销。相比之下,轮询需要频繁地发送请求和接收响应,增加了不必要的网络流量。

实时性比较
WebSocket是一种实时双向通信协议,可以在服务器端有新数据时立即将其推送给客户端,实现实时更新。轮询依赖于定时发送请求,无法实时地获取到最新的数据,存在一定的延迟。

扩展性比较
由于WebSocket使用全双工通信,服务器可以主动向客户端推送数据,这使得WebSocket在处理大规模用户和实时数据推送场景中更具扩展性。轮询在大规模用户时会增加服务器的负载。

兼容性比较
WebSocket在现代浏览器中得到了广泛支持,包括最新版本的桌面和移动浏览器。然而,对于一些旧版浏览器,特别是IE系列的浏览器,可能不支持或提供低的兼容性。轮询可以在几乎所有的浏览器中工作,但存在性能和效率的问题。

开发复杂度比较
WebSocket在实现时相对复杂,需要在前端和后端分别实现相应的逻辑和处理器。而轮询的实现相对简单,只需在前端设置定时器和后端处理请求。因,如果项目对开发时间有限制或者开发资源有限,轮询可能是更简单的解决方案。


轮询的应用场景

实时聊天应用
轮询可以用于实现简单的即时聊天应用。前端定时向服务器发送请求获取最新的消息,实现简单的消息推送功能。

在线游戏应用
对于一些简单的在线游戏应用,轮询可以用于更新玩家之间的动态,例如玩家位置、分数等信息。

股票市场行情显示
在股票市场中,轮询可以用于获取最新的股票行情数据,并在页面上实时展示股票价格的变动。

其他实时数据展示应用
对于需要实时展示数据的应用,例如实时天气预报、实时交通状况,轮询可以用于获取最新的数据并实时更新展示。


WebSocket的应用场景

实时数据推送应用
WebSocket最适合于需要实时推送大量数据的应用场景,例如时股票市场行情、实时新闻推送等。通过建立持久的WebSocket连接,服务器可以主动向客户端推送实时数据,而不需要客户端发起请求。

即时协作应用
对于需要多人实时协作的应用,例如团协作编辑、在线白板等,WebSocket能够实现高效的实时通信,使得个用户之间可以实时共享信息和进行协作操作。

多人在线游戏应用
WebSocket可以用于构建多人在线游戏应用,玩家之间可以实时交互、共享游戏状态和进行实时的游戏操作。

其他需要实时双向通信的应用
WebSocket适用于任何需要实时双向通信的应用场景,例如实时聊天应用、实时客服系统、实时推送通知等。


使用场景的对比与选择

当选择轮询还是WebSocket时,需要根据具体的需求来决定。以下是一些考虑因素:

  • 实时性需求:如果应用需要实时更新,能够快速推送数据给客户端,WebSocket是更好的选择。
  • 性能要求:如果应用需要高性的实时通信,并且可以扩展到大量用户,WebSocket是更合适的方案。
  • 兼容性要求:如果应用需要支持各种浏览器,尤其是旧版浏览器,轮询可能是更可靠的解决方案。
  • 开发难度与成本:WebSocket的实现相对复杂,涉及到前端和后端的开发,而轮询的实现相对简单。

根据对这些因素的权衡,可以选择最适合应用需求的方案。


WebSocket的安全性考虑

在使用WebSocket时,需要考虑一些安全性方面的问题:

  • 跨站脚本攻击(XSS):使用WebSocket时,应确保对用户输入进行适当的验证和过滤,以防止跨站脚本攻击。

  • 跨站请求伪造(CSRF):WebSocket连接可能受到CSRF攻击的威胁。可以使用CSRF令牌或其他身份验证机制来防止此类攻击。

  • 安全认证和授权:确保WebSocket连接的安全认证和授权机制。只有经过身份验证且具有适当权限的用户才能建立WebSocket连接。

  • 数据加密:可以使用SSL/TLS协议对WebSocket连接进行加密,以确保数据在传输过程中的安全性。


WebSocket与服务器端推送技术的比较

WebSocket可以用于服务器端主动推送数据给客户端,与其他服务器端推送技术相比具有如下优势:

  • 实时性:WebSocket具有实时双向通信的能力,可以实时推送数据给客户端,与服务器端轮询相比,可以更快地将数据发送到客户端。

  • 性能:WebSocket使用持久连接,减少了网络传输的开销,且能够高效地处理大规模并发连接。

  • 扩展性:WebSocket具备较高的扩展性,可以处理大量同时连接的用户,且不会造成服务器过载。

  • 兼容性:WebSocket在现代浏览器中得到广泛支持,可以在各种平台和设备上运行。

  • 开发复杂度:相较于其他服务器端推送技术,WebSocket的实现可能更复杂一些,需要在前端和后端分别实现相应的逻辑和处理器。

综上所述,WebSocket与其他服务器端推送技术相比,具有好的实时性、性能、扩展性和兼容性。然而,需要根据具体应用需求和开发资源的限制来选择合适的技方案。

总之,在实时通信方面,WebSocket是一种非常有用的技术,适用于需要实时双向通信的应用场景。与传统的轮询相比,WebSocket具有更好的性能和实时性,可以实现更好的用户体验和效率。同时,需要注意对WebSocket的安全性进行恰当的考虑和防护,以确保数据传输的安全性。

在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1134813.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

匝间冲击耐压试验仪

概述 武汉凯迪正大KDYD2835kV匝间冲击耐压试验仪是采用脉冲波形比较法,以高压冲击波对二线圈或绕组进行过电压的模拟检测,并由示波器来判别二绕组波形差异的一种测试仪器。它能迅速、正确地判断线圈或绕组匝间绝缘电晕放电、局部或相间短路、开路、接线嵌线错误、线…

正点原子嵌入式linux驱动开发——Linux I2C驱动

在电子产品硬件设计当中,I2C 是一种很常见的同步、串行、低速、近距离通信接口,用于连接各种IC、传感器等器件,它们都会提供I2C接口与SoC主控相连,比如陀螺仪、加速度计、触摸屏等,其最大优势在于可以在总线上扩展多个…

uniapp开发小程序—根据生日日期计算年龄 周岁

0、需求 在UniApp开发小程序中,将接口返回的出生日期转化为年龄;判断接口返回的年龄是否是周岁 可以使用JavaScript的日期处理方法来实现。 一、第一种方式(示例代码): //javascript // 假设接口返回的年龄为生日的…

源代码转换:Tangible Software Solutions 23.10 Crack

Tangible Software Solutions The Most Accurate and Reliable Source Code Converters Convert between C#, Java, C, Python, & VB, while saving countless hours of painstaking work and valuable time.源代码转换 Key Benefits Saves valuable time Accurate and com…

美摄人像背景抠图SDK

企业对于图像处理的需求越来越高。无论是社交媒体营销、产品展示还是企业内部培训,高质量的图像都是吸引用户和提升品牌形象的关键。然而,传统的图像处理工具往往需要大量的手动操作和专业技巧,耗时耗力。为了满足企业对于高效、精准的图像处…

LVS+keepalived——高可用集群

LVSkeepalived——高可用集群 keppalived为lvs应运而生的高可用服务。lvs的调度器无法做高可用,于是keepalived这个软件。实现的是调度器的高可用。 但是:keepalived不是专门为lvs集群服务的。也可以做其他代理服务器的高可用。 lvs的高可用集群是建立…

Adobe Creative Cloud没有管理应用程序的权限怎么办?

许多Mac用户在Adobe Creative Cloud自动升级之后显示没有管理应用程序的权限,导致很多Adobe软件无法安装,接下来为大家带来解决方法。 1、前往-前往文件夹-输入以下路径 /Library/Application Support/Adobe/OOBE/Configs/ServiceConfig.xml 2、复制Ser…

k8s-----24、亲和力Affinity

1、应用场景 pod和节点间的关系: 某些Pod优先选择有ssdtrue标签的节点,如果没有在考虑部署到其它节点;某些Pod需要部署在ssdtrue和typephysical的节点上,但是优先部署在ssdtrue的节点上; pod和pod间的关系: 同一个应用的Pod不…

容器类之QT

容器类之QT 顺序容器 关联容器 STL迭代容器 STL风格的反向迭代容器 QVariant类 QFlags类 QRandomGenerator类

2-Java进阶知识总结-6-多线程

文章目录 多线程--基本概念并发和并行进程和线程多线程 多线程--实现方式一,继承Thread类方法介绍实现步骤注意事项 方式二,实现Runnable接口Thread构造方法实现步骤 方式三,实现Callable接口方法介绍实现步骤 三种多线程实现方法对比 多线程…

Java实现多线程内容通俗易懂,一篇文章了解多线程并且能到简单的使用多线程

导学了解 什么是进程? 进程:程序的基本执行实体 更加通俗的讲:一个软件执行后,它就是一个进程,绿色的内容都是一个进程。 什么是线程? 线程是操作系统能够进行运算调度的最小单位。它被包含在进程当中&…

【蓝桥】小蓝的疑问

1、题目 问题描述 小蓝和小桥上完课后,小桥回顾了课上教的树形数据结构,他在地上画了一棵根节点为 1 的树,并且对每个节点都赋上了一个权值 w i w_i wi​。 小蓝对小桥多次询问,每次询问包含两个整数 x , k x,k x,k&#xff…

Iterator迭代器

一、基本概念 Iterator迭代器是一种接口,为不同的数据结构提供一种访问机制,即for … of 循环。当使用for…of循环遍历某种数据结构时,该循环会自动去寻找 Iterator 接口。任何数据结构只要部署Iterator接口,就可以完成遍历操作(…

基于Pytorch的驾驶员分心行为实时检测

本文使用深度学习和Pytorch(PyTorch 2.0.1\Torchvision 0.15.2)实时检测驾驶员的分心行为,并附录完整代码。 检测分心驾驶是现代汽车中最重要的功能之一。无论是自动驾驶汽车还是其它高端汽车,都配备了驾驶员监控系统,以持续跟踪驾驶员的行为。这对确保驾驶员保持目光在道路…

Unity的碰撞检测(二)

温馨提示:本文基于前一篇“Unity的碰撞检测(一)”继续探讨Collider输出,阅读本文则默认已阅读前文。 (一)测试说明 对于Collider输出,我们首先应该保证两个游戏对象具备的是碰撞器而非触发器,所以碰撞器的…

LSTM算法精解(附案例代码)

概念 LSTM(Long Short-Term Memory)是一种循环神经网络(RNN)的变种,用于处理序列数据,特别是在需要长期依赖关系的情况下。LSTM旨在解决传统RNN存在的梯度消失和梯度爆炸问题,这些问题使得RNN难…

18 Transformer 的动态流程

博客配套视频链接: https://space.bilibili.com/383551518?spm_id_from333.1007.0.0 b 站直接看 配套 github 链接:https://github.com/nickchen121/Pre-training-language-model 配套博客链接:https://www.cnblogs.com/nickchen121/p/15105048.html 机…

【BI看板】superset api接口分析

superset 的图表功能已经非常强大了,但是要满足个性化需求,定制是比不可少的了。。。来吧,我们一起看看他的API。 自带api文档 URL 127.0.0.1:5000/swagger/v1 截图 是不是很熟悉,没错就是swagger了。 图表接口地址 127.0.0.1:…

2698 求一个整数的惩罚数 (子集和,DFS)

class Solution { public:bool dfs(int target, string s, int index, int sum) {// 只有整个字符串都被分割,求和,和看结果是不是等于targetif(index s.size()) {return sum target;}int num 0; // 在现在的子集中去依次加入余下的元素// 1 2 9 6// …

vue3 code format bug

vue code format bug vue客户端代码格式化缺陷,为了方便阅读和维护,对代码格式化发现这个缺陷 vue.global.min.3.2.26.js var Vuefunction(r){"use strict";function e(e,t){const nObject.create(null);var re.split(",");for(le…