你使用过WebSocket吗?
什么是WebSocket?
WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,它的出现是为了解决 Web 应用中实时通信的需求。传统的 HTTP 协议是基于请求-响应模式的,即客户端发送请求,服务器响应请求,然后连接关闭。然而,有些场景需要保持长时间的连接,以实现实时性较高的数据交换,这就是 WebSocket 出现的背景。
WebSocket 具有以下特点:
-
全双工通信:WebSocket 允许客户端和服务器在连接建立后双向传输数据,不像传统的 HTTP 请求-响应模式那样需要等待服务器的响应。
-
持久连接:一旦建立 WebSocket 连接,它将保持打开状态,允许在连接的生命周期内随时传输数据,避免了频繁地建立和关闭连接的开销。
-
低延迟:WebSocket 的连接一旦建立,数据可以实时传输,无需等待额外的握手和请求。
-
双方通知:服务器可以主动向客户端发送数据,而不需要客户端首先请求。这对于实时更新和通知非常有用。
-
减少网络流量:WebSocket 通过在连接保持打开的情况下传输数据,可以减少 HTTP 请求的开销,从而减少网络流量。
什么场景可以用WebSocket
WebSocket 适用于需要实时、高效、双向通信的场景,特别是在 Web 应用中。以下是一些适合使用 WebSocket 的场景:
-
实时聊天应用:WebSocket 可以使聊天应用实现实时消息传递,从而用户可以即时收到新消息,无需手动刷新页面。
-
实时协作工具:协作工具(如 Google Docs)可以使用 WebSocket 实现多用户同时编辑文档,实时更新内容。
-
在线游戏:多人在线游戏通常需要实时的玩家间通信,WebSocket 可以提供低延迟的双向通信,使游戏状态和动作可以及时传递。
-
实时更新:当应用需要实时更新数据,如股票市场价格、新闻、天气等,WebSocket 可以将更新直接推送给客户端,而不需要客户端不断地轮询服务器。
-
通知和提醒:应用可以使用 WebSocket 发送实时通知和提醒,如社交媒体的新消息提醒。
-
在线交互式应用:需要实时反馈和即时用户输入响应的应用,如实时投票应用、即时问答平台等。
-
数据监控和控制:监控系统和远程控制系统需要实时更新数据和状态,WebSocket 可以满足这些需求。
总的来说,WebSocket 适用于需要实时性、高效性和双向通信的场景,特别是那些要求即时更新和交互的应用。通过 WebSocket,可以避免不必要的轮询和频繁的请求,提供更好的用户体验。
WebSocket工作原理
-
握手阶段:
- 客户端通过发送一个 HTTP 请求到服务器,包含了一些特殊的头部,如
Upgrade: websocket和Connection: Upgrade。 - 如果服务器支持 WebSocket,它会响应一个 HTTP 101 切换协议的状态码,并同样包含
Upgrade和Connection头部。
- 客户端通过发送一个 HTTP 请求到服务器,包含了一些特殊的头部,如
-
建立连接:
- 一旦握手成功,HTTP 连接就会升级为 WebSocket 连接。
- 这意味着客户端和服务器之间的连接将保持开放状态,双方可以随时传输数据,而无需频繁地建立和关闭连接。
-
数据传输:
- 一旦连接建立,客户端和服务器可以在任何时候发送数据。
- 数据被分成一个个消息(message)进行传输。消息可以是文本或二进制数据。
- 由于是全双工通信,客户端和服务器可以同时发送和接收消息。
-
关闭连接:
- 任何一方都可以随时发起关闭连接的请求。
- 关闭连接的请求是通过发送一个特殊的关闭帧(frame)来实现的。
- 另一方接收到关闭帧后,也会发送一个关闭帧进行确认,并最终关闭连接。
WebSocket 的优势在于它相对于传统的轮询或长轮询技术来说更加高效。在传统的 HTTP 请求中,每次请求都会带有一定的开销,而 WebSocket 的连接是长期保持的,避免了不必要的开销,从而在实时通信场景下更具优势。
前端如何使用WebSocket
在前端使用 WebSocket 可以通过 JavaScript 中的 WebSocket 对象来建立和管理 WebSocket 连接。以下是一个基本的步骤示例:
-
创建 WebSocket 连接:
使用new WebSocket(url)来创建一个 WebSocket 连接。url参数是 WebSocket 服务器的地址。const socket = new WebSocket('ws://your-websocket-server.com'); -
监听事件:
一旦连接建立,WebSocket 对象会触发一系列事件,你可以监听这些事件来处理连接状态和数据。open事件:连接成功建立时触发。message事件:当从服务器接收到消息时触发。error事件:在连接错误时触发。close事件:在连接关闭时触发。
socket.addEventListener('open', (event) => {console.log('WebSocket connection opened.'); });socket.addEventListener('message', (event) => {console.log('Received message:', event.data); });socket.addEventListener('error', (event) => {console.error('WebSocket error:', event); });socket.addEventListener('close', (event) => {console.log('WebSocket connection closed:', event); }); -
发送和接收数据:
使用send(data)方法将数据发送到服务器,并在接收到消息时可以在message事件的回调中处理数据。// 发送数据 socket.send('Hello, server!');// 接收数据在 message 事件中处理 socket.addEventListener('message', (event) => {const receivedData = event.data;console.log('Received data:', receivedData); }); -
关闭连接:
使用close(code, reason)方法来关闭连接,其中code是可选的状态码,reason是可选的关闭原因描述。// 关闭连接 socket.close();
以上就是在前端使用 WebSocket 的基本步骤。要使用 WebSocket,只需在适当的时机创建连接并监听事件,然后可以通过 send 方法发送数据。注意,WebSocket 连接通常在安全的 HTTPS 环境下工作,但也可以在开发环境中使用不安全的 HTTP。同时,WebSocket 服务器端也需要支持 WebSocket 协议。
常用的请求头与响应头
WebSocket 握手请求头字段:
Upgrade:标识请求将升级为 WebSocket 连接。Connection:标识请求将保持连接,值为Upgrade。Sec-WebSocket-Key:包含一个基于随机数的密钥,用于计算握手响应的Sec-WebSocket-Accept值。Sec-WebSocket-Version:指定支持的 WebSocket 协议版本,如13。Sec-WebSocket-Extensions:指定支持的扩展,如压缩等。Sec-WebSocket-Protocol:指定客户端请求的子协议,用于多个子协议的支持。
WebSocket 握手响应头字段:
Upgrade:标识响应将升级为 WebSocket 连接。Connection:标识响应将保持连接,值为Upgrade。Sec-WebSocket-Accept:包含基于客户端的Sec-WebSocket-Key计算的响应密钥。Sec-WebSocket-Extensions:指定服务器支持的扩展。Sec-WebSocket-Protocol:指定实际使用的子协议。
状态码
在 WebSocket 协议中,有一组标准的状态码用于表示连接和关闭的状态。这些状态码通过数字表示,每个状态码都有特定的含义。以下是一些常见的 WebSocket 状态码:
-
连接状态码:
1000:正常关闭。表示连接已经完成关闭。1001:终端关闭。表示终端或用户主动关闭连接。1006:无法连接。表示连接由于某种原因无法建立。
-
保留状态码:
1002:协议错误。表示服务器收到了一个无效的帧或违反了协议规定。1003:数据类型错误。表示服务器无法接受客户端发送的数据类型。1004:保留。此状态码当前未使用。1005:保留。此状态码当前未使用。
-
错误状态码:
1007:数据错误。表示服务器在接收到数据时遇到数据格式错误或不一致。1008:消息过大。表示接收到的消息太大,服务器无法处理。1009:数据过大。表示服务器在处理消息时接收到过大的数据。1010:扩展错误。表示客户端在扩展握手中出现错误。1011:服务错误。表示服务器由于遇到不可恢复的错误而关闭连接。
-
保留状态码:
1012:保留。此状态码当前未使用。1013:保留。此状态码当前未使用。
-
应用程序状态码:
3000-3999:这个范围的状态码是供应用程序自定义使用的,用于特定的应用需求。
相关文章:
你使用过WebSocket吗?
什么是WebSocket? WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,它的出现是为了解决 Web 应用中实时通信的需求。传统的 HTTP 协议是基于请求-响应模式的,即客户端发送请求,服务器响应请求,然后连接关闭。…...
Spark整合hive的时候出错
Spark整合hive的时候 连接Hdfs不从我hive所在的机器上找,而是去连接我的集群里的另外两台机器 但是我的集群没有开 所以下面就一直在retry 猜测: 出现这个错误的原因可能与core-site.xml和hdfs-site.xml有关,因为这里面配置了集群的nameno…...
SocketTools.NET 11.0.2148.1554 Crack
添加新功能以简化使用 URL 建立 TCP 连接的过程。 2023 年 8 月 23 日 - 12:35新版本 特征 添加了“HttpGetTextEx”函数,该函数在返回字符串缓冲区中的文本内容时提供附加选项。添加了对“FileTransfer”.NET 类和 ActiveX 控件中的“GetText”和“PutText”方法的…...
【深度学习-seq2seq模型-附核心encoder和decoder代码】
深度学习 深度学习-seq2seq模型什么是seq2seq模型应用场景架构编码器解码器训练 & 预测损失预测评估BLEUBELU背后的数学意义 模型参考论文 深度学习-seq2seq模型 本文的网络架构模型参考 Sutskever et al., 2014以及Cho et al., 2014 什么是seq2seq模型 Sequence to seq…...
videojs 实现自定义组件(视频画质/清晰度切换) React
前言 最近使用videojs作为视频处理第三方库,用来对接m3u8视频类型。这里总结一下自定义组件遇到的问题及实现,目前看了许多文章也不全,官方文档写的也不是很详细,自己摸索了一段时间陆陆续续完成了,这是实现后的效果.…...
python 模块urllib3 HTTP 客户端库
官网文档地址:https://urllib3.readthedocs.io/en/stable/reference/index.html 一、安装 pip install urlib3二、基本使用 import urllib3 import threadingimg_list ["https://pic.netbian.com/uploads/allimg/220211/004115-1644511275bc26.jpg",&…...
2023 CCPC 华为云计算挑战赛 D-塔
首先先来看第一轮的 假如有n个,每轮那k个 他们的高度的可能性分别为 n 1/C(n,k) n1 C(n-(k-11),1)/C(n,k) n2 C(n-(k-21),2)/C(n,k) ni C(n-(k-i1,i)/C(n,k) 通过概率和高度算出第一轮增加的期望 然后乘上m轮增加的高度加上初始高度,就是总共增加的高度 下面是…...
手搓大模型值just gru
这些类是构建神经网络模型的有用工具,并提供了一些关键功能: EmAdd类使文本输入数据嵌入成为可能,在自然语言处理任务中被广泛使用。通过屏蔽处理填充序列的能力对许多应用程序也很重要。 HeadLoss类是训练神经网络模型进行分类任务的常见损失函数。它计算损失和准确率的能力…...
eslint
什么是eslint ESLint 是一个根据方案识别并报告 ECMAScript/JavaScript 代码问题的工具,其目的是使代码风格更加一致并避免错误。 安装eslint npm init eslint/config执行后会有很多选项,按照自己的需求去选择就好,运行成功后会生成 .esli…...
node_modules.cache是什么东西
一开始没明白这是啥玩意,还以为是npm的属性,网上也没说过具体的来源出处 .cache文件的产生是由webpack4的插件cache-loader生成的,node_modules里下载了cache-loader插件,很多朋友都是vuecli工具生成的项目,内置了这部…...
Python 包管理(pip、conda)基本使用指南
Python 包管理 概述 介绍 Python 有丰富的开源的第三方库和包,可以帮助完成各种任务,扩展 Python 的功能,例如 NumPy 用于科学计算,Pandas 用于数据处理,Matplotlib 用于绘图等。在开始编写 Pytlhon 程序之前&#…...
系统级封装(SiP)技术如何助力智能化应用发展呢?
智能化时代,各种智能设备、智能互连的高速发展与跨界融合,需要高密度、高性能的微系统集成技术作为重要支撑。 例如,在系统级封装(SiP)技术的加持下,5G手机的射频电路面积更小,但支持的频段更多…...
git配置代理(github配置代理)
命令行配置代理方式一git config --global http.proxy http://代理服务器地址:端口号git config --global https.proxy https://代理服务器地址:端口号如果有用户名密码按照下面命令配置 git config --global http.proxy http://用户名:密码代理服务器地址:端口号git config --…...
【数据结构】详解环形队列
文章目录 🌏引言🍀[循环队列](https://leetcode.cn/problems/design-circular-queue/description/)🐱👤题目描述🐱👓示例:🐱🐉提示🐱🏍思…...
Python爬取网页详细教程:从入门到进阶
【导言】: Python作为一门强大的编程语言,常常被用于编写网络爬虫程序。本篇文章将为大家详细介绍Python爬取网页的整个流程,从安装Python和必要的库开始,到发送HTTP请求、解析HTML页面,再到提取和处理数据࿰…...
linux安装JDK及hadoop运行环境搭建
1.linux中安装jdk (1)下载JDK至opt/install目录下,opt下创建目录soft,并解压至当前目录 tar xvf ./jdk-8u321-linux-x64.tar.gz -C /opt/soft/ (2)改名 (3)配置环境变量…...
使用ChatGPT一键生成思维导图
指令1:接下来你回复的所有内容,都放到Markdown代码框中。 指令2:作为一个Docker专家,为我编写一个详细全面的Docker学习大纲,包括基础知识、进阶知识、项目实践案例,学习书籍推荐、学习网站推荐等…...
极简Vim教程
2023年8月27日,周日上午 我不想学那么多命令和快捷键,够用就行... 所以就把我自己认为比较常用的命令和快捷键记录成博客 目录 预备知识Vim的工作模式保存内容退出Vim复制、粘贴和剪切选中一段内容复制粘贴剪切撤回和反撤回撤回反撤回查找替换删除删除…...
在线帮助中心也属于知识管理的一种吗?
在线帮助中心是企业或组织为了提供客户支持而建立的一个在线平台,它包含了各种类型的知识和信息,旨在帮助用户解决问题和获取相关的信息。从知识管理的角度来看,可以说在线帮助中心也属于知识管理的一种形式。下面将详细介绍在线帮助中心作为…...
《Linux从练气到飞升》No.18 进程终止
🕺作者: 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux菜鸟刷题集 😘欢迎关注:👍点赞🙌收藏✍️留言 🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的…...
解锁RePKG的7个实战维度:从资源提取到合规创作的完整指南
解锁RePKG的7个实战维度:从资源提取到合规创作的完整指南 【免费下载链接】repkg Wallpaper engine PKG extractor/TEX to image converter 项目地址: https://gitcode.com/gh_mirrors/re/repkg 一、问题象限:资源处理的真实困境叙事 1.1 独立游…...
Spring AI 实战系列(二):ChatClient封装,告别大模型开发样板代码
系列栏目:Spring AI Spring AI 实战教程(一)入门示例 Spring AI 实战系列(二):ChatClient封装,告别大模型开发样板代码 Spring AI 实战系列(三)&…...
FatFileSystem:面向资源受限MCU的轻量级FAT文件系统
1. FatFileSystem 嵌入式 FAT 文件系统库深度解析FatFileSystem 是一个轻量级、可移植的嵌入式 FAT 文件系统实现,专为资源受限的微控制器环境设计。它并非完整重写的 FAT32 标准栈(如 FatFs),而是对经典开源 FAT 实现的精简裁剪与…...
别让你的 Coding Agent 瞎忙活,你最缺的可能是这套 Harness 规则
别让你的 Coding Agent 瞎忙活,你最缺的可能是这套 Harness 规则 团队把 Claude Code、Codex、Cursor 这类工具接进日常开发后,最先暴露出的瓶颈通常在协作环节。 一个简单的 bug fix 任务,agent 可能会扩出十几个文件的改动。 跑了一行测试…...
论文降AI率全流程教程:检测→分析→降AI→复查四步走完全指南
论文降AI率全流程教程:检测→分析→降AI→复查四步走完全指南 很多同学面对"论文AI率超标"这个问题时,第一反应是慌,第二反应是随便找个工具处理一下,第三反应是发现没降下来,更慌了。 这篇文章要解决的&…...
Bongo-Cat-Mver:实时键盘动画工具的创新应用与实践指南
Bongo-Cat-Mver:实时键盘动画工具的创新应用与实践指南 【免费下载链接】Bongo-Cat-Mver An Bongo Cat overlay written in C 项目地址: https://gitcode.com/gh_mirrors/bo/Bongo-Cat-Mver 在直播、教学和演示场景中,如何让观众清晰感知键盘操作…...
Fast-LIO2 + Lidar_IMU_Init:提升机器人定位精度的完整数据流与标定实战
Fast-LIO2与Lidar_IMU_Init融合实践:从标定到部署的机器人定位优化全流程 在机器人自主导航领域,激光雷达与IMU的融合定位系统已成为工业级应用的主流选择。然而,许多开发者在实际部署时会发现:即使采用了Fast-LIO2这样先进的激光…...
新手必看:用T16IZ遥控器给PX4无人机对频,保姆级图文教程(附接线避坑点)
T16IZ遥控器与PX4无人机对频全指南:从零开始的安全操作手册 刚拿到T16IZ遥控器和PX4无人机套件时,面对密密麻麻的接口和陌生的专业术语,很多新手会感到无从下手。本文将以最直观的方式,带你一步步完成对频操作,同时避开…...
【深度学习新浪潮】如何安全、可靠地使用OpenClaw?
前言 当下AI智能体赛道飞速发展,OpenClaw凭借本地私有化部署、系统级实操能力、多模型兼容的核心优势,成为开发者、办公人群追捧的自动化工具。它可以调度浏览器、执行文件操作、运行终端脚本、串联多步骤业务流程,真正实现大语言模型从对话交互到落地执行的跨越。 但很多…...
掌握NLP实践:从环境搭建到应用部署的6步学习指南
掌握NLP实践:从环境搭建到应用部署的6步学习指南 【免费下载链接】nlp-tutorial A list of NLP(Natural Language Processing) tutorials 项目地址: https://gitcode.com/gh_mirrors/nlp/nlp-tutorial 自然语言处理(NLP)作为人工智能领…...
