详解HTTP:有了HTTP,为何需要WebSocket?

        在日常生活中,HTTP 常用于请求数据。例如,当你打开一个天气预报网站时,浏览器会发送一个 HTTP 请求到服务器,请求当前的天气数据,服务器返回响应,浏览器解析并显示这些数据。

        但是,当涉及到需要服务器主动推送消息的场景时,HTTP 就显得力不从心了。比如,当你在使用一个在线聊天应用时,HTTP 不能高效地实现实时消息推送。如果使用 HTTP 来实现这个功能,你的浏览器需要不断地发送请求去询问服务器是否有新消息(这叫做轮询)。这不仅会增加网络流量和服务器负担,还会导致消息传递的延迟,影响用户体验。

        相比之下,WebSocket 就非常适合这种场景。它允许服务器和客户端之间建立一个持久连接,服务器可以实时地将新消息推送给客户端,而客户端也可以随时向服务器发送消息。这就避免了 HTTP 轮询的缺点,实现了高效的实时通信。        

HTTP 的局限性

1. 客户端主动请求

        HTTP 协议是一个请求-响应模式,客户端发起请求,服务器返回响应。服务器不会主动向客户端发送数据,必须等待客户端的请求。这种模式对于静态页面或者数据不频繁变化的场景非常合适,但对于需要实时数据更新的场景,如在线游戏、实时聊天等,就显得效率低下。

2. 定时轮询与长轮询

        为了在用户无操作的情况下实现数据更新,前端可以采用定时轮询或者长轮询:

  • 定时轮询:前端定时发起 HTTP 请求,服务器返回当前数据状态。虽然实现简单,但频繁的 HTTP 请求会消耗带宽并增加服务器负担,同时可能导致明显的延迟。

  • 长轮询:前端发起一个超时较长的 HTTP 请求,服务器在有数据更新时才返回响应。如果超时则重新发起请求。这减少了请求次数,提高了响应速度,但仍然是客户端主动发起请求的方式。

        尽管这些方法在一定程度上缓解了 HTTP 的局限性,但本质上仍是客户端主动请求,不适合需要频繁数据更新的场景。

WebSocket 的优势

1. 全双工通信

        WebSocket 是基于 TCP 的新协议,支持全双工通信,允许客户端和服务器同时发送和接收数据。这与 HTTP 的半双工通信(单向请求-响应)有本质区别。全双工通信使得 WebSocket 特别适合需要频繁数据交换的应用场景。

2. 高效的数据传输

        WebSocket 连接建立后,数据以帧(frame)的形式在客户端和服务器之间传输。WebSocket 数据帧格式中包含操作码(opcode)和负载数据(payload),这使得数据传输更加高效。相比于 HTTP 每次请求都包含完整的头部信息,WebSocket 减少了传输开销,提升了传输效率。

3. 持久连接

        WebSocket 连接一旦建立,保持连接状态直到显式关闭。相比 HTTP 每次请求都需要重新建立连接,WebSocket 的持久连接大大减少了连接建立和关闭的开销,适合需要长时间数据传输的场景。

WebSocket 的应用场景

1. 实时通信

        WebSocket 广泛应用于实时聊天应用、实时协作工具(如飞书、Slack 等),确保消息能够实时传递和接收,提升用户体验。

2. 在线游戏

        在网页游戏中,服务器需要频繁向客户端推送游戏状态更新,例如怪物的移动、攻击等。使用 WebSocket,可以保证这些数据及时传输,确保游戏流畅运行。

3. 实时数据更新

        金融交易平台、体育赛事直播等场景,需要实时更新数据,WebSocket 提供了一个高效的解决方案,能够迅速推送最新数据到客户端。

WebSocket 与 HTTP 的关系

        WebSocket 与 HTTP 虽然同样基于 TCP,但两者是不同的协议。WebSocket 在连接建立时,使用 HTTP 发起协议升级请求(Connection: Upgrade 和 Upgrade: WebSocket),服务器响应 101 Switching Protocols 状态码完成协议升级。升级完成后,WebSocket 与 HTTP 便没有关系了,之后的通信完全使用 WebSocket 协议。

        这种协议升级机制使得 WebSocket 能够兼容现有的 HTTP 基础设施,并且能够利用浏览器对 HTTP 协议的支持,实现无缝切换。

总结

        尽管 HTTP 在网页浏览中无处不在,但其半双工通信模式和请求-响应机制在需要频繁数据更新和实时交互的场景中显得不足。WebSocket 通过支持全双工通信、高效的数据传输和持久连接,弥补了 HTTP 的这些不足,成为实时应用不可或缺的技术。

        因此,WebSocket 的出现并不是要取代 HTTP,而是作为一种补充,解决了 HTTP 在实时数据传输场景中的不足。WebSocket 的高效性和实时性,使得它在需要频繁交互的应用中,发挥了重要作用。

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

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

相关文章

RocketMq源码解析九:刷盘机制及过期文件删除

一、刷盘机制 刷盘策略在不同时间进行刷写磁盘。RocketMQ的存储是基于JDK NIO的内存映射机制(MappedByteBuffer)的,消息存储首先将消息追加到内存,再根据配置的刷写磁盘 同步刷盘表示消息追加到内存后,立即将数据刷写到文件系统中。代码的调用链如下: submi…

MYBATIS大于等于、小于等于的写法

mybatis使用的是xml格式的文件。使用>和<号的时候&#xff0c;会存在与xml的标签的规范冲突。需要写成如下形式&#xff0c;否则会报错。 第一种写法 原符号 替换符号 < < < <> > > >& &amp; &…

【新版本来袭】ONLYOFFICE桌面编辑器8.1 —— 重塑办公效率与体验

文章目录 一、功能完善的PDF编辑器&#xff1a;重塑文档处理体验编辑文本插入和修改各种对象&#xff0c;如表格、形状、文本框、图像、艺术字、超链接、方程式等添加、旋转和删除页面添加文本注释和标注 二、幻灯片版式设计&#xff1a;创意展示的无限舞台三、改进从右至左显示…

OCR训练和C#部署英文字符训练

PaddleOCR是一个基于飞桨开发的OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;系统。其技术体系包括文字检测、文字识别、文本方向检测和图像处理等模块。以下是其优点&#xff1a; 高精度&#xff1a;PaddleOCR采用深度学习算法进行训练…

Web渗透:php反序列化漏洞

反序列化漏洞&#xff08;Deserialization Vulnerability&#xff09;是一种在应用程序处理数据的过程中&#xff0c;因不安全的反序列化操作引发的安全漏洞&#xff1b;反序列化是指将序列化的数据&#xff08;通常是字节流或字符串&#xff09;转换回对象的过程&#xff0c;如…

安装lora微调大模型

打开终端&#xff08;在Unix或macOS上&#xff09;或命令提示符/Anaconda Prompt&#xff08;在Windows上&#xff09;。 创建一个名为lora的虚拟环境并指定Python版本为3.9。 conda create --name lora python3.9激活新创建的虚拟环境。 conda activate lora克隆项目。 git …

【MySQL备份】lvm-snapshot篇

目录 1.简介 1.1.如何工作 1.2.应用场景 1.3.注意事项 1.4.优缺点 2.为什么选择lvm快照备份&#xff1f; 3.创建LVM 3.1.操作流程 3.2.正常安装MySQL后进行备份 3.3.MySQL运行一段时间后进行备份 3.3.1.准备lvm及文件系统//先添加一块磁盘 3.3.2.将数据迁移到LVM …

MySQL学习(5):SQL语句之数据查询语言:DQL

1.DQL语法 select 字段列表 from 表名列表 #DQL是可以进行多表查询的 where 条件列表 group by 分组字段列表 having 分组后条件列表 order by 排序字段列表 limit 分页参数 2.基本查询&#xff08;select&#xff09; 2.1查询多字段 select 字段1,字段2,字段3,......fro…

基于Volov7的安全帽检测系统

1 项目介绍 1.1 摘要 随着工业化和城市化的迅猛推进&#xff0c;工作场所的安全管理愈发受到重视。安全帽作为保护工人头部安全的关键装备&#xff0c;其实时监测和检测的重要性不言而喻。本文提出并深入研究了基于YOLOv7算法的安全帽佩戴检测技术&#xff0c;该技术旨在实现…

Kotlin/Android中执行HTTP请求

如何在Kotlin/Android中执行简单的HTTP请求

Spring Boot 使用 Mail 实现登录邮箱验证

Spring Boot 使用 Mail 实现登录邮箱验证 引言 在现代的 Web 应用中&#xff0c;用户验证是一个至关重要的功能。电子邮件验证可以有效地防止虚假注册&#xff0c;并确保用户提供的是有效的邮箱地址。在这篇文章中&#xff0c;我们将详细介绍如何使用 Spring Boot 实现用户注…

Day.js

Day.js 是什么&#xff1f; Day.js是一个极简的JavaScript库&#xff0c;可以为现代浏览器解析、验证、操作和显示日期和时间。 Day.js中文网 为什么要使用Day.js &#xff1f; 因为Day.js文件只有2KB左右&#xff0c;下载、解析和执行的JavaScript更少&#xff0c;为代码留下更…

作物检测:YOLOv8+SwanLab

1. 项目介绍 基于深度学习的作物检测通过精准管理和数据驱动决策&#xff0c;能够提高作物产量和质量&#xff0c;优化农业资源利用&#xff0c;推动农业自动化进程&#xff0c;从而保障粮食安全。目前&#xff0c;作物检测领域大多针对单类作物进行检测。因此&#xff0c;本项…

SDIO学习(2)--SD卡 2.0协议

本文参考文档&#xff1a; 《SD Specifications Part 1 Physical Layer Simplified Specification Version 2.00》 1 SD卡简介 1.1 SD卡概念 1.2 SD卡外形和接口 Clk&#xff1a;时钟线&#xff0c;由SDIO主机产生 CMD&#xff1a;命令控制线&#xff0c;SDIO主机通过改…

AI技术在现代社会中的广泛应用及其影响

目录 前言&#xff1a; 一、AI技术在医疗领域的应用 二、AI技术在教育领域的应用 三、AI技术在工业领域的应用 四、AI技术在金融领域的应用 五、AI技术在生活领域的应用 前言&#xff1a; 随着科技的不断发展&#xff0c;人工智能&#xff08;AI&#xff09;技术逐渐成为人…

基于C++标准库实现定时器类

基于C标准库实现定时器类 定时器类是多线程编程中经常设计到的工具类 简单的定时器原理其实很简单&#xff08;是不是有点GNU is not unix的味道;&#xff09;&#xff1a; 创建一个新线程在那个线程里等待等待指定时长后做任务 python标准库中就有这么一个定时器类&#xf…

iOS Swift5 视频播放 能播放各种编码格式的视频的第三方库

1.VLC for ios: MobileVLCKit VLC for ios - github 2.IJKPlayer: IJKMediaFramework 基于 FFmpeg IJKPlayer - github

升级!升级!升级!MobPush基础标签推送全新升级,助力开发者精细化运营

“广播推送点击率不高&#xff0c;会员转化差” “新用户拉新后留存不高&#xff0c;次留、3日留存不达标” “用户的复购较低&#xff0c;黏性不高&#xff0c;导致GMV未达预期” 我们总是会听到运营人员关于目标达成过程中遇到这样或者那样的问题。这些问题汇总起来就回到…

vue3 el-table手动选中某一行、设置默认选中某一行

选中某一行用的是el-table的toggleRowSelection方法&#xff0c;用来切换某一行的选中状态 <template><el-table :data"tableData" ref"myTable" selection-change"handleSelectionChange"><el-table-column type"selectio…

STM32 HAL库 外部中断 实现按键控制LED亮灭

目录 1、为什么使用GPIO外部中断控制LED亮灭&#xff1f; 2、NVIC嵌套向量中断控制器 3、EXTI外部中断 4、项目的硬件排线 5、STM32CUBE_MX配置 6、HAL库代码 7、实际效果 1、为什么使用GPIO外部中断控制LED亮灭&#xff1f; 实现LED亮灭控制有很多方式&#xff0c;其中…