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

WebSocket 详解:全双工通信的实现与应用

目录

一、什么是 WebSocket?(简介)

二、为什么需要 WebSocket?

三、HTTP 与 WebSocket 的区别

WebSocket 的劣势

WebSocket 的常见应用场景

WebSocket 握手过程

WebSocket 事件处理和生命周期


一、什么是 WebSocket?(简介)

        WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。它使得客户端和服务器之间的数据交换变得更加简单,允许服务器主动向客户端推送数据。通过 WebSocket API,浏览器和服务器只需完成一次握手,即可建立持久性连接,开始双向数据传输。

二、为什么需要 WebSocket?

(一)HTTP 的局限性

HTTP 协议是基于请求-响应模式设计的,适用于静态页面交互,但对于实时通信,它存在以下几个问题:

  • 单向通信:HTTP 协议是单向的,客户端必须发起请求,服务器才能响应。服务器无法主动向客户端推送消息。
  • 高延迟:为了获取最新数据,客户端需要不断地发送请求(轮询)检查是否有新数据。这会造成明显的延迟,无法满足实时通信需求。
  • 资源浪费:即使使用长轮询,服务器也需要保持连接直至有新数据可发送,消耗大量服务器资源。频繁的请求还会浪费带宽和服务器处理能力。
(二)WebSocket 的优势
  1. 全双工通信
    WebSocket 支持双向通信,客户端和服务器可以在同一个连接上同时发送和接收消息。与 HTTP 单向请求-响应模式相比,WebSocket 提供了更高效的通信机制,特别适用于需要频繁数据交换的场景。

  2. 长连接
    WebSocket 建立连接后会保持连接持续开启,直到客户端或服务器主动关闭连接。相比 HTTP 中频繁的连接建立和断开,WebSocket 通过长连接提高了性能,减少了开销。

  3. 低延迟
    WebSocket 在建立连接后,消息传输延迟极低。服务器可以主动推送数据给客户端,避免了客户端频繁请求的延迟。

  4. 减少网络开销

  • 减少握手和头部信息:WebSocket 的握手过程只发生在连接建立时,之后数据帧的头部信息较小。相比之下,HTTP 的每个请求都需要携带完整的头部,开销较大。
  • 减少带宽消耗:WebSocket 显著减少了带宽消耗,尤其在与 HTTP 轮询或长轮询相比时,WebSocket 可以更加高效地利用网络资源。
     5.其他优点
  1. 实时功能的实现
    WebSocket 天然支持实时功能,例如:

    • 实时消息推送
    • 实时互动(如在线聊天)
    • 数据同步等
  2. 支持二进制数据
    WebSocket 不仅支持传输文本数据,还能高效地处理二进制数据(如图像、音频、视频等),这使得它在多媒体应用中表现尤为优秀。

  3. 跨平台支持
    WebSocket 是一种标准协议,被广泛支持于各种语言、框架和平台(如 JavaScript、Python、Java 等)。无论是前端浏览器还是后端服务器,都可以轻松实现 WebSocket 功能。

  4. 安全性
    WebSocket 支持通过 TLS/SSL 协议的 WSS 保障数据传输的安全性。此外,还可以结合身份验证机制(如 JWT)或 IP 限制等措施来防止滥用。

三、HTTP 与 WebSocket 的区别

特点WebSocketHTTP
通信方式双向通信单向请求/响应模式
连接类型长连接,连接保持打开短连接,每次请求需新建连接
实时性高,低延迟中等,轮询或长轮询增加延迟
效率数据传输轻量,性能高每次请求头部信息冗余,开销大
适用场景实时推送、聊天、游戏、物联网等静态内容加载、API 调用

WebSocket 的劣势

  1. 复杂性较高

  • 协议实现复杂:与传统的 HTTP 模型相比,WebSocket 协议需要额外的握手过程,并且要求服务器支持 WebSocket 协议。
  • 开发难度:实现双向通信的逻辑,并处理连接生命周期、断线重连等问题,增加了开发难度。
  1. 资源消耗

  • 连接资源占用:WebSocket 需要长期占用服务器的连接资源,尤其在高并发场景中,服务器需维护大量的长连接,可能导致资源消耗增加。
  • 客户端性能开销:在移动设备或低性能设备上,保持 WebSocket 连接可能增加电量和网络资源消耗。
  1. 安全性问题

  • 身份认证不足:WebSocket 本身没有内置身份认证机制,需要额外实现安全验证(如使用 JWT 或 API Key)。
  • 攻击风险:如 DDoS 攻击、WebSocket 劫持、跨站点攻击等安全问题需要额外关注。
  1. 协议的兼容性问题

协议版本:虽然 WebSocket 是标准化协议,但与某些技术栈或库的版本不兼容可能会导致问题(例如旧版客户端和新版服务器之间的不兼容)。

WebSocket 的常见应用场景

  1. 实时聊天
    WebSocket 提供双向、实时的通信机制,适用于即时通讯应用,如聊天应用,使得消息能够迅速、可靠地传递。

  2. 实时协作
    用于实时协作工具,例如在线文档编辑、白板绘画、团队任务管理等,团队成员可以在同一页面上进行实时互动和更新。

  3. 实时数据推送
    用于股票行情、新闻快讯、实时天气信息等实时数据推送,服务器可以及时将数据推送给客户端,确保数据的及时性。

  4. 多人在线游戏
    实时双向通信机制适用于多人在线游戏应用,使得游戏服务器可以实时地传输游戏状态和玩家行为,确保游戏的实时互动。

  5. 在线客服
    WebSocket 可以用于在线客服系统,提供即时响应,减少等待时间,提升用户体验。

WebSocket 握手过程

WebSocket 握手过程是客户端和服务器建立 WebSocket 连接的关键步骤,包含以下几个阶段:

  1. 客户端发起握手请求
    客户端通过 HTTP 协议向服务器发起 WebSocket 握手请求,包含特殊的请求头字段,要求将连接从 HTTP 协议升级为 WebSocket 协议。

    主要请求头:

    • Upgrade: websocket:请求升级协议为 WebSocket。
    • Connection: Upgrade:表明希望升级连接。
    • Sec-WebSocket-Key:一个随机生成的 Base64 编码的字符串,用于协议安全性验证。
    • Sec-WebSocket-Version:表示支持的 WebSocket 协议版本。
    • Origin:可选,表示请求来源,防止跨站点攻击。
  2. 服务器响应握手请求
    服务器在接收到握手请求后,如果支持 WebSocket 协议,并同意协议升级,则返回 101 状态码,表示协议切换成功。

    主要响应头:

    • HTTP/1.1 101 Switching Protocols:表明协议已切换。
    • Sec-WebSocket-Accept:服务器用 SHA-1 加密客户端提供的 Sec-WebSocket-Key,并返回一个 Base64 编码后的值。
  3. WebSocket 连接建立
    客户端收到响应后确认协议切换成功,WebSocket 连接正式建立。

  4. 数据交换
    连接建立后,客户端和服务器可以通过 WebSocket 协议进行高效的双向通信。

  5. 连接关闭
    连接可由客户端或服务器发起关闭。WebSocket 协议定义了一个关闭帧,包含状态码表示关闭原因。

WebSocket 事件处理和生命周期(方法使用介绍)

WebSocket 连接的生命周期包括以下几个主要事件:

  1. onopen:连接成功时触发
    WebSocket 连接成功建立后,onopen 事件触发,客户端可以开始发送数据。
    作用:在连接建立时执行一些初始化操作(如发送第一个消息,记录日志等)。

    let ws = new WebSocket('ws://example.com/socket');
    ws.onopen = function(event) {console.log('Connection established');ws.send('Hello Server');
    };
    
  2. onmessage:接收到消息时触发
    每当服务器发送消息时,onmessage 事件触发,客户端可以处理消息。
    作用:用于处理服务器发来的数据。event.data 包含服务器传来的消息内容。

    ws.onmessage = function(event) {console.log('Received message:', event.data);
    };
    
  3. onclose:连接关闭时触发
    当 WebSocket 连接关闭时,onclose 事件触发,可以进行清理操作。
    作用:用于执行清理操作,如更新 UI 状态或重新连接等。

    ws.onclose = function(event) {if (event.was
    
  4. onerror:发生错误时触发
    onerror 事件在 WebSocket 连接出现错误时触发。
    作用:用于捕获并处理 WebSocket 的错误,可能包括连接失败、数据传输失败等。

    let ws = new WebSocket('ws://example.com/socket');
    ws.onerror = function(event) {console.error('WebSocket error:', event);
    };

WebSocket 心跳机制

详细参考下面博客:

https://blog.csdn.net/Future_yzx/article/details/145359554?sharetype=blogdetail&sharerId=145359554&sharerefer=PC&sharesource=Future_yzx&spm=1011.2480.3001.8118https://blog.csdn.net/Future_yzx/article/details/145359554?sharetype=blogdetail&sharerId=145359554&sharerefer=PC&sharesource=Future_yzx&spm=1011.2480.3001.8118

总结

WebSocket 是一种强大的协议,适用于需要实时通信的应用场景。尽管在实现和资源消耗上有一定的不足,但高效、低延迟和实时性,使得它在现代网络应用中得到了广泛应用。

相关文章:

WebSocket 详解:全双工通信的实现与应用

目录 一、什么是 WebSocket?(简介) 二、为什么需要 WebSocket? 三、HTTP 与 WebSocket 的区别 WebSocket 的劣势 WebSocket 的常见应用场景 WebSocket 握手过程 WebSocket 事件处理和生命周期 一、什么是 WebSocket&#xf…...

漏洞修复:Apache Tomcat 安全漏洞(CVE-2024-50379) | Apache Tomcat 安全漏洞(CVE-2024-52318)

文章目录 引言I Apache Tomcat 安全漏洞(CVE-2024-50379)漏洞描述修复建议升级Tomcat教程II Apache Tomcat 安全漏洞(CVE-2024-52318)漏洞描述修复建议III 安全警告引言 解决方案:升级到最新版Tomcat https://blog.csdn.net/z929118967/article/details/142934649 service in…...

智慧园区系统分类及其在提升企业管理效率中的创新应用探讨

内容概要 智慧园区的概念已经逐渐深入人心,成为现代城市发展中不可或缺的一部分。随着信息技术的飞速发展和数字化转型的不断推进,一系列智慧园区管理系统应运而生。这些系统不仅帮助企业提高了管理效率,还在多个方面激发了创新。 首先&…...

29. 【.NET 8 实战--孢子记账--从单体到微服务】--项目发布

这是本专栏最后一篇文章了,在这片文章里我们不重点讲解如何配置服务器,重点讲如何发布服务,我们开始吧。 一、服务器配置 服务器配置包含:服务器的选择和项目运行环境的配置,下面我们分别来讲解一下。 在服务器选择上…...

Langchain+讯飞星火大模型Spark Max调用

1、安装langchain #安装langchain环境 pip install langchain0.3.3 openai -i https://mirrors.aliyun.com/pypi/simple #灵积模型服务 pip install dashscope -i https://mirrors.aliyun.com/pypi/simple #安装第三方集成,就是各种大语言模型 pip install langchain-comm…...

TensorFlow实现逻辑回归模型

逻辑回归是一种经典的分类算法,广泛应用于二分类问题。本文将介绍如何使用TensorFlow框架实现逻辑回归模型,并通过动态绘制决策边界和损失曲线来直观地观察模型的训练过程。 数据准备 首先,我们准备两类数据点,分别表示两个不同…...

C++进阶课程第2期——排列与组合1

大家好,我是清墨,欢迎收看《C进阶课程——排列与组合》。 啊,上一期我们的情况啊也是非常好的,今天直接开始! 排列(Arrange) 与上期一样啊,我们先了解一下排列的概念。 排列是指将…...

C++17 std::variant 详解:概念、用法和实现细节

文章目录 简介基本概念定义和使用std::variant与传统联合体union的区别 多类型值存储示例初始化修改判断variant中对应类型是否有值获取std::variant中的值获取当前使用的type在variant声明中的索引 访问std::variant中的值使用std::get使用std::get_if 错误处理和访问未初始化…...

Leetcode::119. 杨辉三角 II

119. 杨辉三角 II 已解答 简单 相关标签 相关企业 给定一个非负索引 rowIndex,返回「杨辉三角」的第 rowIndex 行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和。 示例 1: 输入: rowIndex 3 输出: [1,3,3,1]示例 2: 输入: rowIndex 0…...

多模态论文笔记——TECO

大家好,这里是好评笔记,公主号:Goodnote,专栏文章私信限时Free。本文详细解读多模态论文TECO(Temporally Consistent Transformer),即时间一致变换器,是一种用于视频生成的创新模型&…...

Ubuntu 16.04用APT安装MySQL

个人博客地址:Ubuntu 16.04用APT安装MySQL | 一张假钞的真实世界 安装MySQL 用以下命令安装MySQL: sudo apt-get install mysql-server 这个命令会安装MySQL服务器、客户端和公共文件。安装过程会出现两个要求输入的对话框: 输入MySQL root用户的密…...

Linux 4.19内核中的内存管理:x86_64架构下的实现与源码解析

在现代操作系统中,内存管理是核心功能之一,它直接影响系统的性能、稳定性和多任务处理能力。Linux 内核在 x86_64 架构下,通过复杂的机制实现了高效的内存管理,涵盖了虚拟内存、分页机制、内存分配、内存映射、内存保护、缓存管理等多个方面。本文将深入探讨这些机制,并结…...

JavaScript逆向高阶指南:突破基础,掌握核心逆向技术

JavaScript逆向高阶指南:突破基础,掌握核心逆向技术 JavaScript逆向工程是Web开发者和安全分析师的核心竞争力。无论是解析混淆代码、分析压缩脚本,还是逆向Web应用架构,掌握高阶逆向技术都将助您深入理解复杂JavaScript逻辑。本…...

嵌入式知识点总结 Linux驱动 (四)-中断-软硬中断-上下半部-中断响应

针对于嵌入式软件杂乱的知识点总结起来,提供给读者学习复习对下述内容的强化。 目录 1.硬中断,软中断是什么?有什么区别? 2.中断为什么要区分上半部和下半部? 3.中断下半部一般如何实现? 4.linux中断的…...

在ubuntu下一键安装 Open WebUI

该脚本用于自动化安装 Open WebUI,并支持以下功能: 可选跳过 Ollama 安装:通过 --no-ollama 参数跳过 Ollama 的安装。自动清理旧目录:如果安装目录 (~/open-webui) 已存在,脚本会自动删除旧目录并重新安装。完整的依…...

c语言网 1127 尼科彻斯定理

原题 题目描述 验证尼科彻斯定理&#xff0c;即&#xff1a;任何一个整数m的立方都可以写成m个连续奇数之和。 输入格式 任一正整数 输出格式 该数的立方分解为一串连续奇数的和 样例输入 13 样例输出 13*13*132197157159161163165167169171173175177179181 ​ #include<ios…...

Cloudflare通过代理服务器绕过 CORS 限制:原理、实现场景解析

第一部分&#xff1a;问题背景 1.1 错误现象复现 // 浏览器控制台报错示例 Access to fetch at https://chat.qwenlm.ai/api/v1/files/ from origin https://ocr.doublefenzhuan.me has been blocked by CORS policy: Response to preflight request doesnt pass access con…...

吴恩达深度学习——如何实现神经网络

来自吴恩达深度学习&#xff0c;仅为本人学习所用。 文章目录 神经网络的表示计算神经网络的输出激活函数tanh选择激活函数为什么需要非激活函数双层神经网络的梯度下降法 随机初始化 神经网络的表示 对于简单的Logistic回归&#xff0c;使用如下的计算图。 如果是多个神经元…...

《STL基础之vector、list、deque》

【vector、list、deque导读】vector、list、deque这三种序列式的容器&#xff0c;算是比较的基础容器&#xff0c;也是大家在日常开发中常用到的容器&#xff0c;因为底层用到的数据结构比较简单&#xff0c;笔者就将他们三者放到一起做下对比分析&#xff0c;介绍下基本用法&a…...

LockSupport概述、阻塞方法park、唤醒方法unpark(thread)、解决的痛点、带来的面试题

目录 ①. 什么是LockSupport? ②. 阻塞方法 ③. 唤醒方法(注意这个permit最多只能为1) ④. LockSupport它的解决的痛点 ⑤. LockSupport 面试题目 ①. 什么是LockSupport? ①. 通过park()和unpark(thread)方法来实现阻塞和唤醒线程的操作 ②. LockSupport是一个线程阻塞…...

3分钟上手弹幕盒子:零基础高效制作自定义弹幕的免费工具

3分钟上手弹幕盒子&#xff1a;零基础高效制作自定义弹幕的免费工具 【免费下载链接】danmubox.github.io 弹幕盒子 项目地址: https://gitcode.com/gh_mirrors/da/danmubox.github.io 弹幕盒子是一款专业的在线自定义弹幕生成工具&#xff0c;以轻量化架构设计为核心&a…...

神州数码无线网络(AC+AP)实战部署与优化指南

1. 神州数码ACAP无线网络部署前的规划准备 第一次接触神州数码无线网络方案时&#xff0c;我被它简洁的架构设计惊艳到了。AC&#xff08;无线控制器&#xff09;AP&#xff08;接入点&#xff09;的组网模式&#xff0c;特别适合500-2000平米的中型企业办公环境。但在真正动手…...

Graphormer开源模型部署教程:3.7GB小模型+RTX4090一键启动分子建模服务

Graphormer开源模型部署教程&#xff1a;3.7GB小模型RTX4090一键启动分子建模服务 1. 项目介绍 Graphormer是一种基于纯Transformer架构的图神经网络模型&#xff0c;专门为分子图&#xff08;原子-键结构&#xff09;的全局结构建模与属性预测而设计。这个3.7GB的小模型在OG…...

SpringBoot + MongoDB 5分钟快速集成:从0到1实操指南

目录 MongoDB‌ 快速集成 常用API MongoDB‌ MongoDB‌ 是一个基于分布式文件存储的‌文档型数据库‌&#xff0c;属于 NoSQL 数据库中最接近关系型数据库的产品&#xff0c;旨在为 Web 应用提供高性能、高可用和可扩展的数据存储解决方案 。 MongoDB以灵活的无模式文档模型…...

如何用Wi-Fi信号实现非接触检测:ESP-CSI完整指南

如何用Wi-Fi信号实现非接触检测&#xff1a;ESP-CSI完整指南 【免费下载链接】esp-csi Applications based on Wi-Fi CSI (Channel state information), such as indoor positioning, human detection 项目地址: https://gitcode.com/GitHub_Trending/es/esp-csi 想要让…...

springboot+vue基于web的美食外卖点餐平台的设外卖员商家

目录同行可拿货,招校园代理 ,本人源头供货商外卖员功能分析商家功能分析技术实现要点项目技术支持源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作同行可拿货,招校园代理 ,本人源头供货商 外卖员功能分析 外卖员在美食外卖点餐平台中的核心…...

致翔智慧校园招生迎新系统正式上线!一键解锁「零跑腿」入学新体验!

告别排长队、告别填不完的纸质表、告别来回跑、告别信息反复核对&#xff01;致翔智慧校园招生迎新管理系统重磅上线啦&#xff01;从招生报名到迎新报到&#xff0c;全流程数字化、一站式智能化&#xff0c;轻松搞定所有环节&#xff01;✨ 告别繁琐&#xff0c;新生入学超丝滑…...

手把手教你部署OpenClaw(小龙虾),打造专属AI数字员工

2026年&#xff0c;开源AI智能体OpenClaw&#xff08;国内昵称“小龙虾”&#xff09;凭借独特的“数字员工”定位迅速崛起&#xff0c;GitHub星标一路攀升至28万&#xff0c;成为当下最受开发者和办公人群青睐的开源AI项目。 一、OpenClaw核心优势解析 OpenClaw能在众多开源…...

WebPages 发布

WebPages 发布 引言 随着互联网技术的飞速发展,Web技术已经成为现代信息社会不可或缺的一部分。WebPages作为Web技术的重要应用,旨在为用户提供高效、便捷的网页浏览体验。本文将详细介绍WebPages的发布过程,包括技术选型、功能设计、性能优化以及用户体验等方面。 技术选…...

告别pip install失败:手把手教你用Anaconda虚拟环境快速部署Mayavi(Python 3.9亲测)

告别pip install失败&#xff1a;手把手教你用Anaconda虚拟环境快速部署Mayavi&#xff08;Python 3.9亲测&#xff09; 科学计算和三维可视化是Python生态中的重要应用场景&#xff0c;而Mayavi作为一款强大的三维数据可视化库&#xff0c;在流体力学、医学影像、地质勘探等领…...