深入理解 WebSocket:实时通信的利器

深入理解 WebSocket:实时通信的利器

1. 什么是 WebSocket?

WebSocket 是一种网络通信协议,它允许服务器和客户端之间建立持久的双向通信通道,适用于高频率、低延迟的数据交换场景。在传统的 HTTP 通信中,每次请求都需要客户端发起并等待服务器响应,连接在请求结束后会关闭。这种模式在需要频繁交互的数据场景下效率低下。WebSocket 则通过一次连接握手后建立的持久连接,允许双向数据实时传输,极大地降低了通信延迟。

1.1 WebSocket 与 HTTP 的区别

特性WebSocketHTTP
连接模式持久连接,支持双向通信短连接,请求-响应模型
数据传输方向客户端和服务器可互相发送数据仅客户端发起请求,服务器响应
网络开销较低,减少连接和断开次数较高,每次请求都需重新建立和断开连接
适用场景实时应用,低延迟、高频交互场景静态资源获取、传统 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 应用变得更加智能和高效。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/884527.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

关于frp Web界面-----frp Server Dashboard 和 frp Client Admin UI

Web 界面 官方文档:https://gofrp.org/zh-cn/docs/features/common/ui/ 目前 frpc 和 frps 分别内置了相应的 Web 界面方便用户使用。 客户端 Admin UI 服务端 Dashboard 服务端 Dashboard 服务端 Dashboard 使用户可以通过浏览器查看 frp 的状态以及代理统计信…

godot4.2入门项目 dodge_the_creep学习记录

前言 在学习博客Godot4 你的第一个2d游戏中的项目时,遇到了点小问题,记录一下。 官方项目 传送门 问题 怪兽直接从屏幕中间部分冒出来,以及角色出现时位于屏幕外角色被设置的背景图遮挡 解决方法 1.节点的位置没有对齐,正确示例…

Apache APISIX学习(2):安装Grafana、prometheus

一、Grafana安装 1、介绍 Grafana 是一个监控仪表系统,它是由 Grafana Labs 公司开源的的一个系统监测 (System Monitoring) 工具。它可以大大帮助你简化监控的复杂度,你只需要提供你需要监控的数据,它就可以帮你生成各种可视化仪表。同时它…

Vue-Bag-Admin 采用漂亮的 Naive UI 构建的开源中后台系统,基于 Vue3 / Vite / TypeScript 等最新的前端技术栈

这是一款完成度很高、实用性很强的 admin 前端框架,颜值不错,推荐给大家。 Vue-Bag-Admin 在官网上也直接称为 Bag-Admin,这是一款专门为企业项目搭建中后台管理平台的前端框架,基于目前最新的前端技术栈 Vue3、Vite、TypeScript…

程序设计题(65—72)

第六十五题 题目 请编写函数fun&#xff0c;它的功能是&#xff1a;计算下列级数和&#xff0c;和值由函数值返回。 例如&#xff0c;当n10&#xff0c;x0.3时&#xff0c;函数值为1.349859。 #include <conio.h> #include <stdio.h> #include <math.h> #…

5.使用 VSCode 过程中的英语积累 - Go 菜单(每一次重点积累 5 个单词)

前言 学习可以不局限于传统的书籍和课堂&#xff0c;各种生活的元素也都可以做为我们的学习对象&#xff0c;本文将利用 VSCode 页面上的各种英文元素来做英语的积累&#xff0c;如此做有 3 大利 这些软件在我们工作中是时时刻刻接触的&#xff0c;借此做英语积累再合适不过&a…

react:React Hook函数

使用规则 只能在组件中或者其他自定义的Hook函数中调用 只能在组件的顶层调用&#xff0c;不能嵌套在if、for、 其他函数中 基础Hook 函数 useState useState是一个hook函数&#xff0c;它允许我们向组件中添加一个状态变量&#xff0c;从而控制影响组件的渲染结果 示例1…

人生苦短,我用Python✌

面向代码的解释型语言 数据开发和AI 编程语言:让计算机了解我们干什么&#xff0c;翻译官 1.下载软件 解释器安装 点击第二个 改路径 D:\python 安装 测试 winr打开 输入代码 输出 退出环境 exit&#xff08;&#xff09; 新建文本文档后缀改成py 编写 运行 安装编写代码…

开放词汇全景分割

开放词汇全景分割是一种先进的计算机视觉任务&#xff0c;它旨在将图像中的每个像素分割并分类到预先定义或未定义的类别中。这与传统的图像分割不同&#xff0c;后者通常仅限于识别有限的、预先定义的对象类别。开放词汇全景分割的目标是识别和处理图像中的任何可能的对象&…

Fastadmin 前台任意文件读取漏洞

漏洞描述 FastAdmin是一个基于ThinkPHP5和Bootstrap的后台开发框架&#xff0c;支持权限管理、响应式开发、多语言、模块化开发、CRUD和自由可扩展等功能。 漏洞复现 FOFA body"fastadmin.net" || body"<h1>fastadmin</h1>" && tit…

SpringMVC源码-SpringMVC框架中Spring父容器和SpringMVC子容器加载的流程以及SpringMVC九大内置组件的初始

一、Spring父容器启动 SpringMVC 的项目结构如下: applicationContext.xml spring的配置文件 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.o…

微调大模型(Finetuning Large Language Models)—Evaluation(六)

1. 微调后对模型进行评估 模型的评估目前没有统一的标准&#xff0c;有从正向角度&#xff0c;核对是否命中&#xff0c;当然也有从反向角度&#xff0c;考虑未命中的错误分析。 常见的评估方式如图所示&#xff1a; 本节学习资料地址&#xff1a;传送门 2. 代码测试 2.1 …

【Python】多个dataframe存入excel的不同的sheet表里,而不会被覆盖的方法

我发现&#xff0c;我原来用的多个工作簿存入的方法&#xff0c;发现不太可行&#xff0c;如果我用原来的方法&#xff0c;然后for循环&#xff0c;新的dataframe会把原来的覆盖掉&#xff0c;然后只剩下一个工作薄。原先的代码&#xff1a; with pd.ExcelWriter(file_name ) …

XSS闯关小游戏(前13关)

挖掘思路 1.存在可控参数 2.页面存在回显 3.使用带有特殊字符的语句去测试&#xff0c;网站是否进行了实例化 ( 例如 ">123 ) 4.构造闭合&#xff0c;实现payload的逃逸 1 name处参数可控&#xff0c;直接打即可 2 这里知道<>被实体编码了 再测试">1…

想做个WPS的自动化代码,参考如下:

&#x1f3c6;本文收录于《全栈Bug调优(实战版)》专栏&#xff0c;主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&am…

大碗娱乐发布业务调整说明 取消艺人经纪业务

大碗娱乐今日发布业务调整说明&#xff1a;不再负责艺人业务&#xff0c;而贾玲导演将专注内容创作。据悉&#xff0c;其公司旗下艺人张小斐、许君聪、卜钰、何欢、张泰维、朱天福、曹贺军、刘宏禄的经纪合约均已到期&#xff0c;双方不再续约&#xff0c;但未来会共同寻求以其…

【HTML5】html5开篇基础(3)

1.❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; Hello, Hello~ 亲爱的朋友们&#x1f44b;&#x1f44b;&#xff0c;这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章&#xff0c;请别吝啬你的点赞❤️❤️和收藏&#x1f4d6;&#x1f4d6;。如果你对我的…

[大语言模型-论文精读] Diffusion Model技术-通过时间和空间组合扩散模型生成复杂的3D人物动作

​​​​​​Generation of Complex 3D Human Motion by Temporal and Spatial Composition of Diffusion Models L Mandelli, S Berretti - arXiv preprint arXiv:2409.11920, 2024 通过时间和空间组合扩散模型生成复杂的3D人物动作 摘要 本文提出了一种新的方法&#xff0…

Vue 学习

vue 核心语法 <!DOCTYPE html> <html> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Vue 核心语法测试</title> </head><body&…

Vue项目之Element-UI(Breadcrumb)动态面包屑效果 el-breadcrumb

效果预览 需要导航的页面Vue.js 最笨的方法就是在每个需要面包屑的页面中固定写好 <template><div class="example-container"><el-breadcrumb separator="/"