深入理解 WebSocket:实时通信的利器
深入理解 WebSocket:实时通信的利器
1. 什么是 WebSocket?
WebSocket 是一种网络通信协议,它允许服务器和客户端之间建立持久的双向通信通道,适用于高频率、低延迟的数据交换场景。在传统的 HTTP 通信中,每次请求都需要客户端发起并等待服务器响应,连接在请求结束后会关闭。这种模式在需要频繁交互的数据场景下效率低下。WebSocket 则通过一次连接握手后建立的持久连接,允许双向数据实时传输,极大地降低了通信延迟。
1.1 WebSocket 与 HTTP 的区别
特性 | WebSocket | HTTP |
---|---|---|
连接模式 | 持久连接,支持双向通信 | 短连接,请求-响应模型 |
数据传输方向 | 客户端和服务器可互相发送数据 | 仅客户端发起请求,服务器响应 |
网络开销 | 较低,减少连接和断开次数 | 较高,每次请求都需重新建立和断开连接 |
适用场景 | 实时应用,低延迟、高频交互场景 | 静态资源获取、传统 Web 应用 |
典型应用 | 实时聊天、在线游戏、股票行情、协同编辑等 | 网站内容浏览、资源获取、表单提交等 |
WebSocket 的优势体现在实时通信的能力上,尤其适用于那些需要服务器实时推送更新数据的场景。
2. WebSocket 的工作原理
WebSocket 使用的是标准的 TCP 协议,但它的连接是从 HTTP 协议升级而来的。这意味着 WebSocket 可以复用 HTTP 的握手机制(通过 Upgrade
头部字段),在最初的连接建立阶段,客户端会发送一个标准的 HTTP 请求,并在头部声明希望使用 WebSocket 协议。如果服务器同意,则返回 101 状态码(协议切换),并从此时起双方就可以通过 WebSocket 进行双向通信。
2.1 握手过程
- 客户端请求:客户端向服务器发起一个包含
Upgrade: websocket
的 HTTP 请求,表示希望升级到 WebSocket。 - 服务器响应:服务器验证请求后,如果同意升级,则返回状态码 101 和相应的 WebSocket 握手头部字段。
- 握手成功:握手成功后,连接变为持久连接,双方可以开始传输数据,直到连接被主动关闭。
WebSocket 使用了标准的 HTTP 端口(80 或 443),因此能够穿透大部分防火墙和代理,且它的全双工特性使得客户端和服务器可以在不需要多次握手的情况下随时交换信息。
3. WebSocket 的应用场景
WebSocket 的设计初衷就是为了解决实时通信的需求,尤其是在高并发、低延迟场景中非常有用。以下是一些典型的应用场景:
3.1 实时聊天应用
在线聊天系统需要服务器能够即时将用户发送的消息广播给其他用户。通过 WebSocket,可以在一个持久连接中让所有用户在第一时间接收到消息,而无需轮询服务器或等待客户端请求,非常适合聊天室、客服系统等场景。
3.2 实时推送通知
新闻网站、股票交易平台和社交媒体常需要实时推送数据,例如新闻更新、股票价格变动或新的消息提醒。WebSocket 可以让服务器在数据发生变化时即时通知客户端,无需客户端频繁轮询服务器。
3.3 在线多人游戏
多人在线游戏需要在用户之间快速同步位置、动作等数据。WebSocket 提供了低延迟、高频率的通信能力,使得游戏中的每个动作都能立即广播给其他玩家,从而保证了流畅的实时互动体验。
3.4 实时协作工具
例如,在线文档编辑工具允许多个用户同时编辑同一个文档,文档的变化需要在所有用户的浏览器中实时同步。通过 WebSocket,服务器能够在某个用户修改文档后,立即将修改内容推送给其他协作者。
4. WebSocket 在 Spring Boot 中的实现方式
Spring Boot 对 WebSocket 的支持非常丰富,开发者可以根据不同的业务场景选择合适的实现方式。以下是三种常见的 WebSocket 实现方式,每种方式有不同的适用场景和特点。
4.1 基于 JSR 356 标准的实现
JSR 356 是 Java 中的 WebSocket 标准 API,它允许开发者通过注解的方式来定义 WebSocket 服务器端点。该实现方式简单直观,开发者只需在类上使用 @ServerEndpoint
注解,便可定义一个 WebSocket 端点。该方式非常适合开发简单的实时通信应用,比如简单的聊天室、通知推送等。
- 优点:实现简单,代码量少,适合轻量级的 WebSocket 应用。
- 缺点:功能相对单一,无法灵活控制复杂的业务逻辑。
4.2 基于 WebSocketHandler
的实现
Spring 提供了 WebSocketHandler
接口,允许开发者自定义 WebSocket 的行为。与注解方式不同,WebSocketHandler
方式可以更加灵活地处理消息接收和发送的细节,也支持处理文本、二进制等多种消息格式。此外,开发者还可以配置自定义的拦截器,用于实现用户验证、消息过滤等功能。
- 优点:灵活性高,适合需要复杂消息处理逻辑的应用。
- 缺点:相比于注解实现方式,代码较为复杂,适用于需要定制化业务逻辑的场景。
4.3 基于 STOMP 协议的实现
深入理解STOMP协议
STOMP(Simple Text Oriented Messaging Protocol)是一种简单的消息传输协议,常与 WebSocket 一起使用。STOMP 的核心功能是支持发布/订阅模型,允许多个客户端订阅某个消息主题,然后由服务器推送消息到所有订阅者。这种方式非常适合开发多客户端互动的实时系统,比如股票推送、在线协作工具等。
Spring 提供了对 STOMP 的内置支持,开发者可以通过注解轻松实现消息的路由、订阅和分发。
- 优点:内置消息路由和发布/订阅机制,适合复杂的多人互动场景。
- 缺点:实现较为复杂,需要理解 STOMP 协议及其在 Spring 中的集成方式。
5. WebSocket 的优势与局限
5.1 优势
- 双向通信:WebSocket 的全双工通信特性,允许服务器和客户端在同一连接上随时发送数据,而无需多次建立连接。
- 低延迟:通过持久连接,WebSocket 消除了 HTTP 的频繁握手过程,极大地减少了通信延迟。
- 适合高并发:WebSocket 协议本身非常轻量级,允许在高并发场景下依然保持低开销的通信。
5.2 局限
- 适用场景有限:WebSocket 更适用于需要实时数据推送的场景,对于静态内容的获取或不需要频繁通信的应用,HTTP 依然是更合适的选择。
- 兼容性问题:虽然现代浏览器都支持 WebSocket,但一些老旧的网络基础设施(如防火墙、代理服务器)可能会阻碍 WebSocket 的使用。
- 状态管理:WebSocket 是持久连接,需要额外的机制来管理连接的生命周期和状态,否则可能导致资源泄露。
6. 结论
WebSocket 作为一种强大的实时通信协议,在现代 Web 应用中扮演着越来越重要的角色,尤其在需要频繁、低延迟通信的场景中。通过 WebSocket,开发者可以实现丰富的实时交互体验,从简单的消息推送到复杂的多人在线协作,都能够通过持久的 WebSocket 连接实现高效的通信。
在 Spring Boot 中,WebSocket 的实现有多种选择,开发者可以根据应用需求选择最合适的方案。对于轻量级的实时应用,可以使用基于 JSR 356 标准的实现;对于需要更高自定义能力的场景,可以选择 WebSocketHandler
实现;而在复杂的多人互动场景中,STOMP 协议的发布/订阅机制是最好的选择。
通过合理使用 WebSocket,可以为用户提供更为实时、互动性强的体验,让 Web 应用变得更加智能和高效。
相关文章:
深入理解 WebSocket:实时通信的利器
深入理解 WebSocket:实时通信的利器 1. 什么是 WebSocket? WebSocket 是一种网络通信协议,它允许服务器和客户端之间建立持久的双向通信通道,适用于高频率、低延迟的数据交换场景。在传统的 HTTP 通信中,每次请求都需…...

OpenEuler配置本地yum源
0x00 服务器版本 将本地镜像传输至服务器 操作步骤如下 # 创建一个目录用于挂载光盘映像 mkdir /media/cdrom/# 将光盘映像挂载到指定目录 mount /kvm/openeuler.iso /media/cdrom/#进入Yum仓库配置目录 cd /etc/yum.repos.d/# 备份原有的 openEuler.repo 文件 mv openEuler.…...

论文不同写作风格下的ChatGPT提示词分享
学境思源,一键生成论文初稿: AcademicIdeas - 学境思源AI论文写作 在学术论文写作中,不同的写作风格能显著影响文章的表达效果与读者的理解。无论是描述性、分析性、论证性,还是批判性写作风格,合理选择和运用恰当的写…...

单点登录(SSO)基础
单点登录(SSO, Single Sign-On) 是一种身份认证机制,允许用户在多个独立的应用系统中只进行一次登录操作,即可访问所有授权的应用或服务,而无需每次切换应用时都进行登录。SSO 提高了用户体验的便捷性,同时…...

设置VsCode搜索时排除文件,文件列表中隐藏文件
按照《VsCode gdb gdbserver远程调试C程序》中介绍的方法,配置好VsCode后,打开一个C/C工程,发现左侧的面板会显示编译时生成的中间文件(比如.d和.o文件)。我们可以通过设置隐藏掉一些我们不需要打开的文件以简洁面板…...

急!现在转大模型还来得及吗?零基础入门到精通,收藏这一篇就够了
大模型的出现,让行内和行外大多数人都感到非常焦虑。 行外很多人想了解却感到无从下手,行内很多人苦于没有硬件条件无法尝试。想转大模型方向,相关的招聘虽然层出不穷,但一般都要求有大模型经验。而更多的人,则一直处…...

使用 lstm + crf 实现NER
条件随机场CRF 前言 CRF是给定一组输入随机变量条件下另一组输出随机变量的条件概率分布的模型。特点:假设输出随机变量构成马尔卡夫随机场。CRF可以用于不同的预测问题。但是主要讨论线性链条件随机场,这时问题变成了由输入序列对输出序列的判别模型&…...

【牛掰】这款RPA多平台引流获客软件已正式上线,助您日引流1000+
哈喽大家好我是年哥,自从上次与大家团购了那款基于autojs开发的RPA引流获客的源码,经过本缝合怪不断地修修补补,终于将它变成自己的了,还为它起了个魔幻的名字:获客宝RPA。尽管部分功能还有点瑕疵,但是不管…...

Python的包管理工具pip安装
Python的包管理工具pip安装 一、安装步骤1.检查 pip是否已安装2.安装 pip方法一:通过 ensurepip 模块安装(推荐)方法二:通过 get-pip.py 脚本安装(经常应为网络域名问题连接不上) 3.验证pip安装4.创建别名5.更新pip 二、常…...
《AIGC 时代程序员的应对之策》
在 AIGC 大语言模型不断涌现、AI 辅助编程工具日益普及的当下,程序员的工作方式确实面临着深刻变革。对于程序员来说,如何应对这一趋势成为了至关重要的问题。 一方面,有人担忧 AI 可能取代部分编程工作。不可否认,随着技术的发展…...

51单片机系列-串口(UART)通信技术
🌈个人主页: 羽晨同学 💫个人格言:“成为自己未来的主人~” 并行通信和串行通信 并行方式 并行方式:数据的各位用多条数据线同时发送或者同时接收 并行通信特点:传送速度快,但因需要多根传输线…...

使用k8s部署java前后端服务
一、项目架构 前端、后端、数据库 1)前端 静态的资源:img css html js文件 js:axios、ajax 2)后端 提供数据:根据web前端发送的请求,从数据库中获取数据 请求都是无状态的,如何保持会话 …...
使用docker创建zabbix服务器
首先保证服务器已正常安装docker,然后执行下面这几个容器创建命令: #创建MySQL容器 docker run --name mysql-server -t --restartunless-stopped -e MYSQL_DATABASE"zabbix" -e MYSQL_USER"zabbix" -e MYSQL_PASSWORD"zabbix_…...
nodejs 016: javascript语法——解构赋值({ a, b, c } = {})=>{console.log(“Hello“);}
在 JavaScript 中,函数参数 { a, b, c } {} 的含义是在函数定义时提供一个默认的对象参数。这个对象包含了三个可选的属性 a, b, 和 c。如果没有传递参数或者传递的参数是一个非对象类型的值,那么函数内部将使用一个空对象 {} 作为参数。 示例 const …...

【人人都能看懂的大模型原理】(一)
前言 当前大模型的学习资源呈现爆发趋势,各种角色的人都用自己的视角参与到大模型的讨论。但是我发现这些学习资源都有几个特点:只摆事实而不讲道理;只讲应用可能而不提实现代价;只讲可能性而缺乏实操经验分享;洞察材…...
JMeter源码解析之JMeter命令行新增命令
JMeter源码解析之JMeter命令行新增命令 需求描述 需要新增一条命令,能够在JMeter命令行中能够展示输入对应的JMeter命令,能够展示对应的命令信息 查看命令效果如下: apache-jmeter-5.1\bin>jmeter --? Copyright © 1999-2024 The …...

YOLOv8 Windows c++推理
#添加一个**yolov8\_。onx **和/或**yolov5\_。Onnx **模型(s)到ultralytics文件夹。 #编辑**main.cpp**来改变**projectBasePath**来匹配你的用户。#请注意,默认情况下,CMake文件将尝试导入CUDA库以与opencv dnn (cuDNN) GPU推理一起使用。 #如果你的Op…...
一文读懂Python中的Popen函数
目录 1. 基本知识2. Demo 1. 基本知识 在Python中,Popen 是 subprocess 模块中的一个函数,它用于创建一个子进程并与其进行通信 subprocess.Popen():Popen 类用于创建和管理子进程 与 os.system() 或 os.popen() 相比,Popen 提供…...

07-阿里云镜像仓库
07-阿里云镜像仓库 注册阿里云 先注册一个阿里云账号:https://www.aliyun.com/ 进入容器镜像服务控制台 工作台》容器》容器服务》容器镜像服务 实例列表》个人实例 仓库管理》镜像仓库》命名空间》创建命名空间 仓库管理》镜像仓库》镜像仓库》创建镜像仓库 使…...
net core mvc 数据绑定 《2》
mvc core 模型绑定 控制绑定名称 》》》Bind 属性可以用来指定 模型应该 绑定的前缀 public class MyController : Controller {[HttpPost]public ActionResult Create([Bind(Prefix "MyModel")] Ilist<MyModel> model){// 模型绑定将尝试从请求的表单数据中…...

华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...

AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...

2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...

Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...