当前位置: 首页 > news >正文

你使用过WebSocket吗?

什么是WebSocket?

WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,它的出现是为了解决 Web 应用中实时通信的需求。传统的 HTTP 协议是基于请求-响应模式的,即客户端发送请求,服务器响应请求,然后连接关闭。然而,有些场景需要保持长时间的连接,以实现实时性较高的数据交换,这就是 WebSocket 出现的背景。

WebSocket 具有以下特点:

  1. 全双工通信:WebSocket 允许客户端和服务器在连接建立后双向传输数据,不像传统的 HTTP 请求-响应模式那样需要等待服务器的响应。

  2. 持久连接:一旦建立 WebSocket 连接,它将保持打开状态,允许在连接的生命周期内随时传输数据,避免了频繁地建立和关闭连接的开销。

  3. 低延迟:WebSocket 的连接一旦建立,数据可以实时传输,无需等待额外的握手和请求。

  4. 双方通知:服务器可以主动向客户端发送数据,而不需要客户端首先请求。这对于实时更新和通知非常有用。

  5. 减少网络流量:WebSocket 通过在连接保持打开的情况下传输数据,可以减少 HTTP 请求的开销,从而减少网络流量。

什么场景可以用WebSocket

WebSocket 适用于需要实时、高效、双向通信的场景,特别是在 Web 应用中。以下是一些适合使用 WebSocket 的场景:

  1. 实时聊天应用:WebSocket 可以使聊天应用实现实时消息传递,从而用户可以即时收到新消息,无需手动刷新页面。

  2. 实时协作工具:协作工具(如 Google Docs)可以使用 WebSocket 实现多用户同时编辑文档,实时更新内容。

  3. 在线游戏:多人在线游戏通常需要实时的玩家间通信,WebSocket 可以提供低延迟的双向通信,使游戏状态和动作可以及时传递。

  4. 实时更新:当应用需要实时更新数据,如股票市场价格、新闻、天气等,WebSocket 可以将更新直接推送给客户端,而不需要客户端不断地轮询服务器。

  5. 通知和提醒:应用可以使用 WebSocket 发送实时通知和提醒,如社交媒体的新消息提醒。

  6. 在线交互式应用:需要实时反馈和即时用户输入响应的应用,如实时投票应用、即时问答平台等。

  7. 数据监控和控制:监控系统和远程控制系统需要实时更新数据和状态,WebSocket 可以满足这些需求。

总的来说,WebSocket 适用于需要实时性、高效性和双向通信的场景,特别是那些要求即时更新和交互的应用。通过 WebSocket,可以避免不必要的轮询和频繁的请求,提供更好的用户体验。

WebSocket工作原理

  1. 握手阶段

    • 客户端通过发送一个 HTTP 请求到服务器,包含了一些特殊的头部,如 Upgrade: websocketConnection: Upgrade
    • 如果服务器支持 WebSocket,它会响应一个 HTTP 101 切换协议的状态码,并同样包含 UpgradeConnection 头部。
  2. 建立连接

    • 一旦握手成功,HTTP 连接就会升级为 WebSocket 连接。
    • 这意味着客户端和服务器之间的连接将保持开放状态,双方可以随时传输数据,而无需频繁地建立和关闭连接。
  3. 数据传输

    • 一旦连接建立,客户端和服务器可以在任何时候发送数据。
    • 数据被分成一个个消息(message)进行传输。消息可以是文本或二进制数据。
    • 由于是全双工通信,客户端和服务器可以同时发送和接收消息。
  4. 关闭连接

    • 任何一方都可以随时发起关闭连接的请求。
    • 关闭连接的请求是通过发送一个特殊的关闭帧(frame)来实现的。
    • 另一方接收到关闭帧后,也会发送一个关闭帧进行确认,并最终关闭连接。

WebSocket 的优势在于它相对于传统的轮询或长轮询技术来说更加高效。在传统的 HTTP 请求中,每次请求都会带有一定的开销,而 WebSocket 的连接是长期保持的,避免了不必要的开销,从而在实时通信场景下更具优势。

前端如何使用WebSocket

在前端使用 WebSocket 可以通过 JavaScript 中的 WebSocket 对象来建立和管理 WebSocket 连接。以下是一个基本的步骤示例:

  1. 创建 WebSocket 连接
    使用 new WebSocket(url) 来创建一个 WebSocket 连接。url 参数是 WebSocket 服务器的地址。

    const socket = new WebSocket('ws://your-websocket-server.com');
    
  2. 监听事件
    一旦连接建立,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);
    });
    
  3. 发送和接收数据
    使用 send(data) 方法将数据发送到服务器,并在接收到消息时可以在 message 事件的回调中处理数据。

    // 发送数据
    socket.send('Hello, server!');// 接收数据在 message 事件中处理
    socket.addEventListener('message', (event) => {const receivedData = event.data;console.log('Received data:', receivedData);
    });
    
  4. 关闭连接
    使用 close(code, reason) 方法来关闭连接,其中 code 是可选的状态码,reason 是可选的关闭原因描述。

    // 关闭连接
    socket.close();
    

以上就是在前端使用 WebSocket 的基本步骤。要使用 WebSocket,只需在适当的时机创建连接并监听事件,然后可以通过 send 方法发送数据。注意,WebSocket 连接通常在安全的 HTTPS 环境下工作,但也可以在开发环境中使用不安全的 HTTP。同时,WebSocket 服务器端也需要支持 WebSocket 协议。

常用的请求头与响应头

WebSocket 握手请求头字段

  1. Upgrade:标识请求将升级为 WebSocket 连接。
  2. Connection:标识请求将保持连接,值为 Upgrade
  3. Sec-WebSocket-Key:包含一个基于随机数的密钥,用于计算握手响应的 Sec-WebSocket-Accept 值。
  4. Sec-WebSocket-Version:指定支持的 WebSocket 协议版本,如 13
  5. Sec-WebSocket-Extensions:指定支持的扩展,如压缩等。
  6. Sec-WebSocket-Protocol:指定客户端请求的子协议,用于多个子协议的支持。

WebSocket 握手响应头字段

  1. Upgrade:标识响应将升级为 WebSocket 连接。
  2. Connection:标识响应将保持连接,值为 Upgrade
  3. Sec-WebSocket-Accept:包含基于客户端的 Sec-WebSocket-Key 计算的响应密钥。
  4. Sec-WebSocket-Extensions:指定服务器支持的扩展。
  5. Sec-WebSocket-Protocol:指定实际使用的子协议。

状态码

在 WebSocket 协议中,有一组标准的状态码用于表示连接和关闭的状态。这些状态码通过数字表示,每个状态码都有特定的含义。以下是一些常见的 WebSocket 状态码:

  1. 连接状态码

    • 1000:正常关闭。表示连接已经完成关闭。
    • 1001:终端关闭。表示终端或用户主动关闭连接。
    • 1006:无法连接。表示连接由于某种原因无法建立。
  2. 保留状态码

    • 1002:协议错误。表示服务器收到了一个无效的帧或违反了协议规定。
    • 1003:数据类型错误。表示服务器无法接受客户端发送的数据类型。
    • 1004:保留。此状态码当前未使用。
    • 1005:保留。此状态码当前未使用。
  3. 错误状态码

    • 1007:数据错误。表示服务器在接收到数据时遇到数据格式错误或不一致。
    • 1008:消息过大。表示接收到的消息太大,服务器无法处理。
    • 1009:数据过大。表示服务器在处理消息时接收到过大的数据。
    • 1010:扩展错误。表示客户端在扩展握手中出现错误。
    • 1011:服务错误。表示服务器由于遇到不可恢复的错误而关闭连接。
  4. 保留状态码

    • 1012:保留。此状态码当前未使用。
    • 1013:保留。此状态码当前未使用。
  5. 应用程序状态码

    • 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页面,再到提取和处理数据&#xff0…...

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)配置环境变量&#xf…...

使用ChatGPT一键生成思维导图

指令1:接下来你回复的所有内容,都放到Markdown代码框中。 指令2:作为一个Docker专家,为我编写一个详细全面的Docker学习大纲,包括基础知识、进阶知识、项目实践案例,学习书籍推荐、学习网站推荐等&#xf…...

极简Vim教程

2023年8月27日,周日上午 我不想学那么多命令和快捷键,够用就行... 所以就把我自己认为比较常用的命令和快捷键记录成博客 目录 预备知识Vim的工作模式保存内容退出Vim复制、粘贴和剪切选中一段内容复制粘贴剪切撤回和反撤回撤回反撤回查找替换删除删除…...

在线帮助中心也属于知识管理的一种吗?

在线帮助中心是企业或组织为了提供客户支持而建立的一个在线平台,它包含了各种类型的知识和信息,旨在帮助用户解决问题和获取相关的信息。从知识管理的角度来看,可以说在线帮助中心也属于知识管理的一种形式。下面将详细介绍在线帮助中心作为…...

《Linux从练气到飞升》No.18 进程终止

🕺作者: 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux菜鸟刷题集 😘欢迎关注:👍点赞🙌收藏✍️留言 🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...

【HTTP三个基础问题】

面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...

Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?

Pod IP 的本质与特性 Pod IP 的定位 纯端点地址:Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址(如 10.244.1.2)无特殊名称:在 Kubernetes 中,它通常被称为 “Pod IP” 或 “容器 IP”生命周期:与 Pod …...

云原生周刊:k0s 成为 CNCF 沙箱项目

开源项目推荐 HAMi HAMi(原名 k8s‑vGPU‑scheduler)是一款 CNCF Sandbox 级别的开源 K8s 中间件,通过虚拟化 GPU/NPU 等异构设备并支持内存、计算核心时间片隔离及共享调度,为容器提供统一接口,实现细粒度资源配额…...

在golang中如何将已安装的依赖降级处理,比如:将 go-ansible/v2@v2.2.0 更换为 go-ansible/@v1.1.7

在 Go 项目中降级 go-ansible 从 v2.2.0 到 v1.1.7 具体步骤: 第一步: 修改 go.mod 文件 // 原 v2 版本声明 require github.com/apenella/go-ansible/v2 v2.2.0 替换为: // 改为 v…...

DeepSeek越强,Kimi越慌?

被DeepSeek吊打的Kimi,还有多少人在用? 去年,月之暗面创始人杨植麟别提有多风光了。90后清华学霸,国产大模型六小虎之一,手握十几亿美金的融资。旗下的AI助手Kimi烧钱如流水,单月光是投流就花费2个亿。 疯…...