WebSocket详解:从前端到后端的全栈理解
文章目录
- 前言
- 一、WebSocket简介
- 1.1 WebSocket的特点
- 二、WebSocket的工作原理
- 2.1 握手过程
- 2.2 数据传输
- 三、WebSocket在前端的应用
- 四、WebSocket在后端的应用
- 五、WebSocket的局限与解决方案
- 结语
前言
随着互联网技术的发展,传统的HTTP协议在某些场景下的局限性逐渐显现,特别是在需要服务器主动向客户端推送数据的实时应用场景中。为了克服这些局限,WebSocket协议应运而生,它为Web应用提供了全双工通信的能力,即服务器和客户端可以同时发送数据,无需等待对方的响应。本文将详细介绍WebSocket的工作原理及其在前后端的应用。
一、WebSocket简介
WebSocket是一种在单个TCP连接上进行全双工通信的协议。它允许服务端主动向客户端推送数据,与传统的HTTP请求/响应模式不同,WebSocket一旦建立连接,就可以进行双向数据传输,极大地提高了通信效率。WebSocket协议在2011年被IETF标准化为RFC 6455,随后又被RFC 7936补充规范。
1.1 WebSocket的特点
- 全双工通信:服务器和客户端可以同时发送数据
- 持久连接:一旦建立连接,除非一方主动断开,否则连接将一直保持
- 轻量级:相比HTTP,WebSocket的数据传输更加高效,头部信息更小
- 支持多种数据类型:不仅可以发送文本数据,还可以发送二进制数据
- 跨域通信:没有同源策略的限制,客户端可以与任意服务器通信
- 安全性:支持加密连接,使用wss协议 (类似于https)
二、WebSocket的工作原理
WebSocket协议的连接建立过程基于HTTP协议。首先,客户端通过发送一个特殊的HTTP请求来请求建立WebSocket连接。这个请求中包含了一些特殊的头信息,如Upgrade: websocket和Connection: Upgrade,表明客户端希望将当前连接升级为WebSocket连接。服务器收到请求后,会检查这些头信息,并通过特定的响应头来确认连接的升级。一旦连接建立,后续的数据传输将不再遵循HTTP协议,而是使用WebSocket协议。
2.1 握手过程
- 客户端请求
GET /chat HTTP/1.1 Host: example.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== Sec-WebSocket-Version: 13 - 服务器响应
HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
2.2 数据传输
一旦握手成功,客户端和服务器就可以通过这个持久连接进行双向数据传输。WebSocket协议定义了两种类型的数据帧:文本帧(text frame)和二进制帧(binary frame)。每个帧都有一个固定格式,包括帧头和负载数据。
三、WebSocket在前端的应用
在前端,JavaScript提供了WebSocket API,使得开发者可以轻松地在网页中使用WebSocket。以下是一个简单的示例,展示了如何使用JavaScript创建WebSocket连接并发送接收消息
// 创建WebSocket对象
const socket = new WebSocket('ws://example.com/socket')// 监听连接打开事件
socket.addEventListener('open', function (event) {console.log('WebSocket connection established.')// 发送消息socket.send('Hello, WebSocket!')
})// 监听消息接收事件
socket.addEventListener('message', function (event) {console.log('Message from server:', event.data)
})// 监听连接关闭事件
socket.addEventListener('close', function (event) {console.log('WebSocket connection closed.')
})
四、WebSocket在后端的应用
在后端,WebSocket的实现取决于所使用的编程语言和框架。例如,在Node.js中,可以使用ws库来创建WebSocket服务器。以下是一个简单的Node.js WebSocket服务器示例
const WebSocket = require('ws')const wss = new WebSocket.Server({ port: 8080 })wss.on('connection', function connection(ws) {console.log('Client connected.')// 监听客户端发送的消息ws.on('message', function incoming(message) {console.log('Received:', message)// 向客户端发送消息ws.send(`Echo: ${message}`)})// 当客户端断开连接时ws.on('close', function close() {console.log('Client disconnected.')})
})
五、WebSocket的局限与解决方案
- 局限:不支持旧版浏览器
- 解决方案:使用socket.io库,它不仅支持WebSocket,还提供了对多种浏览器的兼容性,并能在WebSocket不可用时自动降级到其他传输方式(如轮询)
结语
WebSocket协议为Web应用提供了强大的实时通信能力,特别是在需要服务器主动推送数据的场景中。通过本文的介绍,相信读者对WebSocket有了更深入的理解。无论是前端还是后端开发,掌握WebSocket都能为您的应用带来更好的用户体验。
相关文章:
WebSocket详解:从前端到后端的全栈理解
文章目录 前言一、WebSocket简介1.1 WebSocket的特点 二、WebSocket的工作原理2.1 握手过程2.2 数据传输 三、WebSocket在前端的应用四、WebSocket在后端的应用五、WebSocket的局限与解决方案结语 前言 随着互联网技术的发展,传统的HTTP协议在某些场景下的局限性逐…...
SOLIDWORKS 2025加快装配体设计 确保可制造性
在快速变化的制造业环境中,SOLIDWORKS作为一款CAD软件,始终致力于提供有效、智能且可靠的解决方案,以满足设计师和工程师对装配体设计的多样化需求。随着SOLIDWORKS 2025版本的发布,其在加快装配体设计、确保可制造性方面取得了显…...
简单题:计算从位置 x 到 y 的最少步数| 豆包MarsCode AI刷题
题目解析:计算从位置 x 到 y 的最少步数 题目描述 题目要求从整数位置 x 移动到整数位置 y,每一步可以将当前位置增加或减少,且每步的增加或减少的值必须是连续的整数。首末两步的步长必须是 1。要求求出从 x 到 y 的最少步数。 思路分析 …...
HTML 基础标签——表单标签<form>
文章目录 1. `<form>` 标签:定义表单容器2. `<input>` 标签:多用途输入控件3. `<textarea>` 标签:多行文本输入框4. `<select>` 标签:下拉选择框5. `<option>` 标签:下拉菜单选项6. `<button>` 标签:按钮元素7. `<label>` 标签…...
LeetCode 每日一题 2024/10/28-2024/11/3
记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步 目录 10/28 685. 冗余连接 II10/29 3211. 生成不含相邻零的二进制字符串10/30 3216. 交换后字典序最小的字符串10/31 3165. 不包含相邻元素的子序列的最大和11/1 3259. 超级饮料…...
基于Spring Boot和Vue的电子商城系统功能设计
基于Spring Boot和Vue的电子商城系统功能设计 该系统是一个基于Spring Boot和Vue框架的电子商城平台,包含前台商城和后台管理系统。系统功能设计包括用户购物体验和管理员管理功能,支持商品的分类展示、收藏、购物车和订单管理等模块。以下是系统功能的简…...
成都睿明智科技有限公司正规吗靠谱吗?
在这个短视频风起云涌的时代,抖音电商以其独特的魅力,成为了无数商家竞相追逐的新蓝海。而在这片浩瀚的商海中,成都睿明智科技有限公司犹如一艘装备精良的航船,引领着众多企业破浪前行,探索抖音电商的无限可能。今天&a…...
【天线&化学】航拍图屋顶异常检测系统源码&数据集全套:改进yolo11-ContextGuided
改进yolo11-ContextGuided等200全套创新点大全:航拍图屋顶异常检测系统源码&数据集全套 1.图片效果展示 项目来源 人工智能促进会 2024.11.01 注意:由于项目一直在更新迭代,上面“1.图片效果展示”和“2.视频效果展示”展示的系…...
【回忆】JavaScript 中的 Map 有哪些方法
在 JavaScript 中,Map 对象是一种键值对的集合,类似于对象,但“键”可以是任何数据类型(对象或原始值)。Map 提供了多种方法来操作这些键值对。以下是 Map 对象的一些常用方法: 创建和初始化 new Map(): …...
Chrome与夸克的安全性对比
在当今数字化时代,浏览器的安全性对于用户来说至关重要。Chrome和夸克作为两款流行的浏览器,各有其特点和优势。本文将对这两款浏览器的安全性进行详细对比,帮助用户更好地了解它们之间的差异。(本文由https://www.chromegw.com/的…...
使用Python可视化支持向量机(SVM)
支持向量机(SVM)是用于分类和回归任务的强大监督学习模型。它们受欢迎背后的一个关键因素是它们有效处理线性和非线性数据的能力。在本文中,我们将探索使用Python和流行的库(如scikit-learn和Matplotlib)可视化SVM。 …...
C++泛型编程
一、什么是泛型编程 泛型编程 是一种编程范式,它通过编写可以处理多种数据类型的代码来实现代码的灵活复用。泛型编程主要通过模板来实现。 比如我们日常使用的容器类型vector就应用了模板来实现其通用性,我们在使用时可以通过传入型别创建对应的动态数…...
【论文分享】利用大量街景图片研究街道空间质量与建筑环境属性之间的关联
本研究通过有序逻辑回归模型,结合街景图片和街道数据,分析了街道空间质量与建筑环境属性的关系。通过Kappa分析和相关性分析,确定了影响街道空间质量的因素,并绘制了质量分布图。这些因素与街道质量的不同维度相关联,对…...
【Linux第七课--基础IO】内存级文件、重定向、缓冲区、文件系统、动态库静态库
目录 引入内存级文件重新使用C文件接口 -- 对比重定向写文件读文件文件流 认识文件操作的系统接口open参数 -- flagflag的内容宏的传参方式 open关闭文件写文件读文件结论 引入文件描述符fd、对文件的理解理解一切皆文件方法集文件fd的分配规则 重定向代码的重定向输入重定向输…...
对比C/C++语言,Rust语言有什么优势?
Rust语言相较于C/C语言有以下几个主要优势: 1. 内存安全:Rust通过其所有权系统和借用规则在编译时捕获许多常见的内存安全错误,如空指针引用和数据竞争,避免了许多常见的安全漏洞。这与C/C不同,后者通常需要手动管理内…...
Rust语言有哪些数据类型?
Rust语言的数据类型主要包括以下几种: 一、基本数据类型 1. 整数类型 i8, i16, i32, i64, i128: 有符号整数 u8, u16, u32, u64, u128: 无符号整数 isize, usize: 根据平台选择大小的整数(通常用于指针和索引) 2. 浮点数类型 f32: 32位浮…...
【论文笔记】Attention Prompting on Image for Large Vision-Language Models
🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。 基本信息 标题: Attention Prompting on I…...
VScode设置系统界面字体
现象: 系统界面字体太大,导致菜单栏字体显示不全,每次使用都要先点然后才能打开终端和帮助 缩小字体应该就可以实现全部都看到的效果 步骤 Window: Zoom Level 调整所有窗口的默认缩放级别。大于“0”的每个增量(例如“1”&…...
Java中常见的异常类型
1、Exception和Error有什么区别? 首先Exception和Error都是继承于Throwable类,在Java中只有Throwable类型的实例才可以被抛出(throw)或者捕获(catch),它是异常处理机制的基本组成类型。 Except…...
Java学习Day58:相声二人组!(项目统计数据Excel图表导出)
<!DOCTYPE html> <html xmlns"http://www.w3.org/1999/html"><head><!-- 页面meta --><meta charset"utf-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><title>瑞通健康</tit…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
