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

Web Socket 使用详解

在信息爆炸的时代,用户对网页的期待早已超越了静态内容的展示。实时聊天、股票报价、协同编辑等功能的实现,都离不开服务器与客户端之间持续、高效的数据交互。传统的HTTP请求-响应模型难以满足这种需求,而WebSocket的出现,为构建实时Web应用打开了新的大门。

一、WebSocket

简介:WebSocket 是基于 TCP 的一种新的网络协议。它实现了浏览器与服务器全双工通信——浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接, 并进行双向数据传输。

1.1 告别HTTP的束缚

传统的HTTP协议是一种单向的请求-响应模型,客户端发起请求,服务器返回响应。这种模式下,服务器无法主动向客户端推送数据,只能依赖客户端不断轮询,效率低下且实时性差。

WebSocket协议的诞生打破了这种僵局。它基于TCP协议,建立起全双工的通信通道,允许服务器和客户端随时随地互相发送消息,无需等待请求,极大地提升了实时性。

1.2 WebSocket的优势
  • 实时双向通信: 摆脱HTTP单向请求的限制,实现真正的双向数据传输,服务器可以主动推送数据,客户端可以实时接收。

  • 低延迟: 持久的连接减少了每次请求建立连接的开销,数据传输更加迅速,延迟更低,用户体验更佳。

  • 高效率: WebSocket数据包头更小,相比HTTP减少了带宽消耗,提升了数据传输效率。

  • 广泛支持: 主流浏览器和服务器技术都已支持WebSocket,为开发者提供了便利。

1.3 WebSocket的应用场景
  • 实时聊天应用: 构建高效率、低延迟的聊天室、即时消息应用,例如微信、QQ等。

  • 实时数据推送: 实时更新股票报价、新闻推送、系统通知等信息,例如金融交易平台、资讯网站等。

  • 在线协作工具: 实现多人协同编辑文档、在线白板、多人游戏等功能,例如Google Docs、Figma等。

  • 物联网应用: 实现设备实时监控、远程控制等功能,例如智能家居、工业自动化等领域。

二、WebSocket工作原理

2.1 建立连接:从HTTP到WebSocket的握手
  1. 客户端发起请求: 客户端使用HTTP协议向服务器发起WebSocket连接请求,并在请求头中包含WebSocket相关信息,例如:

    GET /chat HTTP/1.1
    Host: example.com
    Upgrade: websocket  // 请求升级协议
    Connection: Upgrade 
    Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== // 随机生成的key
    Sec-WebSocket-Version: 13  // WebSocket版本

  2. 服务器响应确认: 服务器收到请求后,如果同意建立WebSocket连接,则返回一个HTTP响应,确认升级协议,例如:

    HTTP/1.1 101 Switching Protocols 
    Upgrade: websocket
    Connection: Upgrade
    Sec-WebSocket-Accept: s3pPLMBiTxaQ9kZZ7TdQihdUh-8= // 根据key计算出的值

    至此,WebSocket连接建立,客户端和服务器之间可以进行双向数据传输。

2.2 数据传输:帧结构解析

WebSocket使用帧(Frame)作为数据传输的基本单元,每个帧包含以下部分:

  • FIN (1 bit): 标识是否是消息的最后一片段,1 表示是最后一片段,0 表示还有后续片段。

  • RSV1, RSV2, RSV3 (各 1 bit): 保留位,供未来扩展使用。

  • Opcode (4 bits): 表示消息类型,例如:

    • 0x01: 文本消息

    • 0x02: 二进制消息

    • 0x08: 关闭连接

    • 0x09: Ping消息

    • 0x0A: Pong消息

  • Mask (1 bit): 标识Payload data是否进行了掩码处理,客户端发送的消息必须进行掩码处理,服务器发送的消息则不需要。

  • Payload len (7 bits / 7+16 bits / 7+64 bits): 表示Payload data的长度。

  • Masking-key (0/32 bits): 如果Mask位为1,则包含4字节的掩码密钥,用于对Payload data进行异或运算,进行掩码处理。

  • Payload data: 实际传输的数据内容,可以是文本、二进制等。

2.3 连接关闭:挥手告别

当一方需要关闭WebSocket连接时,可以发送一个关闭帧,另一方收到后,应该回复一个关闭帧,然后关闭连接。

三、Spring Boot 中使用 WebSocket

Spring Boot 对 WebSocket 提供了良好的支持,使得开发者可以轻松构建实时应用。

3.1 引入依赖

在项目的 pom.xml 文件中添加 spring-boot-starter-websocket 依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

3.2 创建WebSocket处理器

使用 @ServerEndpoint 注解创建一个WebSocket处理器,用于处理WebSocket连接:

import org.springframework.stereotype.Component;
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;@Component
@ServerEndpoint("/chat") // 指定WebSocket连接的路径
public class ChatEndpoint {// 建立连接时触发@OnOpenpublic void onOpen(Session session) {System.out.println("New connection established: " + session.getId());}// 收到客户端消息时触发@OnMessagepublic void onMessage(String message, Session session) throws IOException {System.out.println("Received message from " + session.getId() + ": " + message);// 向客户端发送消息session.getBasicRemote().sendText("Server received: " + message);}// 连接关闭时触发@OnClosepublic void onClose(Session session) {System.out.println("Connection closed: " + session.getId());}// 发生错误时触发@OnErrorpublic void onError(Session session, Throwable throwable) {System.out.println("Error occurred: " + throwable.getMessage());}
}

  • @ServerEndpoint("/chat"): 指定WebSocket连接的路径,客户端需要连接到该路径才能建立WebSocket连接。

  • @OnOpen: 当WebSocket连接建立成功时触发,可以进行一些初始化操作,例如记录连接信息等。

  • @OnMessage: 当接收到客户端发送的消息时触发,可以根据消息内容进行相应的处理,例如广播消息、保存数据等。

  • @OnClose: 当WebSocket连接关闭时触发,可以进行一些清理操作,例如释放资源等。

  • @OnError: 当WebSocket连接发生错误时触发,可以进行一些错误处理操作,例如记录日志、关闭连接等。

3.3 客户端代码示例 (JavaScript)
var websocket = new WebSocket("ws://localhost:8080/chat"); // 创建WebSocket对象,指定连接地址websocket.onopen = function(event) {console.log("WebSocket connection opened"); // 连接成功回调
};websocket.onmessage = function(event) {console.log("Server message: " + event.data); // 收到消息回调
};websocket.onclose = function(event) {console.log("WebSocket connection closed"); // 连接关闭回调
};function sendMessage() {var message = document.getElementById("messageInput").value;websocket.send(message); // 发送消息
}

四、对比

HTTP协议和WebSocket协议对比:

  • HTTP是短连接

  • WebSocket是长连接

  • HTTP通信是单向的,基于请求响应模式

  • WebSocket支持双向通信

  • HTTP和WebSocket底层都是TCP连接

WebSocket缺点:

服务器长期维护长连接需要一定的成本 各个浏览器支持程度不一 WebSocket 是长连接,受网络限制比较大,需要处理好重连

结论:WebSocket并不能完全取代HTTP,它只适合在特定场景下使用(实时弹幕、网页聊天等)

五、总结

WebSocket作为HTML5规范的一部分,为构建实时Web应用提供了强大的解决方案。它克服了传统HTTP请求-响应模型的局限性,实现了服务器和客户端之间的双向通信。Spring Boot对WebSocket的良好支持,使得开发者可以更加便捷地构建高性能、实时交互的Web应用。

以上就是关于WebSocket的使用详解,感谢各位看官的观看,下期见,谢谢~

相关文章:

Web Socket 使用详解

在信息爆炸的时代&#xff0c;用户对网页的期待早已超越了静态内容的展示。实时聊天、股票报价、协同编辑等功能的实现&#xff0c;都离不开服务器与客户端之间持续、高效的数据交互。传统的HTTP请求-响应模型难以满足这种需求&#xff0c;而WebSocket的出现&#xff0c;为构建…...

【Python Web开发】Python Web开发知识全解析

Python Web开发知识全解析 Python 是一种强大的编程语言&#xff0c;以其简洁和高效而闻名&#xff0c;尤其在 Web 开发领域&#xff0c;它有着广泛的应用。Python 提供了许多功能强大且灵活的 Web 框架&#xff0c;如 Flask、Django、FastAPI 等&#xff0c;使得构建现代 Web…...

Android开发展开收起功能

Android开发展开收起功能 文字过长展开收起功能很普通&#xff0c;也很需要。 一、思路&#xff1a; 自定义控件MoreTextView 二、效果图&#xff1a; 三、关键代码&#xff1a; public class MoreTextView2 extends LinearLayout {/*** TextView的实际高度*/private int …...

Sealos Devbox 发布,珍爱生命,远离 CI/CD

水滴攻击太阳系用的是最原始的攻击方式&#xff1a;撞击&#xff01;却又如此有效率。 当我们搞了一堆容器、编排、CI/CD、DevOps&#xff0c;发明了一大堆没什么用的名词之后&#xff0c;最终发现这些操作都是花里胡哨&#xff0c;让开发者越陷越深。 最终你会发现一个真理&…...

数据结构——遍历二叉树

目录 什么是遍历二叉树 根据遍历序列确定二叉树 例题&#xff08;根据先序中序以及后序中序求二叉树&#xff09; 遍历的算法实现 先序遍历 中序遍历 后序遍历 遍历算法的分析 二叉树的层次遍历 二叉树遍历算法的应用 二叉树的建立 复制二叉树 计算二叉树深度 计算二…...

【Ubuntu】在Ubuntu上安装IDEA

【Ubuntu】在Ubuntu上安装IDEA 零、前言 最近换了Ubuntu系统&#xff0c;但是还得是要写代码&#xff0c;这样就不可避免地用到IDEA&#xff0c;接下来介绍一下如何在Ubuntu上安装IDEA。 壹、下载 这一步应该很容易的&#xff0c;直接打开IDEA的下载页面&#xff0c;点击下…...

解决:gpg: 从公钥服务器接收失败:服务器故障

当你添加密钥时报错&#xff0c;可以按照下面的步骤&#xff0c;依次输入。 # 停止 Network Manager 服务 sudo service network-manager stop# 删除 Network Manager 的状态文件 sudo rm /var/lib/NetworkManager/NetworkManager.state# 重新启动 Network Manager 服务 sudo …...

支持向量机SVM

目录 1 SVM直觉理解2. 软硬间隔3. 升维转换及核技巧入门 参考资料 1 SVM直觉理解 通过一条直线将两类数据分开&#xff0c;并且当有新的数据加入时&#xff0c;通过该条直线就能判别其属于哪一类 为了区分两类数据&#xff0c;N为数据的样本数&#xff0c;M为维度数&#xf…...

斯坦福UE4 C++课学习补充25:AI感知组件

文章目录 一、引入感知组件并绑定委托二、优化角色旋转 一、引入感知组件并绑定委托 PawnSensingComponent是UE中用于感知其他 Pawn&#xff08;或 Actor&#xff09;存在的一个组件&#xff0c;常用于 AI 角色的视觉、听觉等感知功能。它为 AI 提供了基础的感知能力&#xff…...

大模型 memory 记忆 缓存的应用

在探讨大模型的“memory”&#xff08;记忆&#xff09;功能时&#xff0c;我们通常会涉及缓存、存储以及如何有效管理和利用这些记忆来增强模型的性能。以下是对大模型memory记忆、缓存及相关概念的详细分析&#xff1a; 一、大模型的记忆功能 大模型&#xff0c;特别是大型…...

perl 给特定文件加上特定内容

perl 给特定文件加上特定内容 给所有的输入文件&#xff0c;加上特定的内容 本例中&#xff0c;给所有的输入文件内加入## Copyright xxx 如果检测到已经有## Copyright字样的行&#xff0c;那么不添加&#xff0c;具体代码如下。 可以使用该脚本&#xff0c;给所有的verilog文…...

全面解析网络性能监控系统与网络故障排除技巧,助力IT运维高效管理

目录 一、什么是网络性能监控系统&#xff1f; 1.1 网络性能监控系统的定义与作用 二、网络性能监控的关键指标 三、网络故障排除的重要性 3.1 为什么网络故障排除至关重要&#xff1f; 3.2 网络故障的常见类型 四、如何高效进行网络故障排除&#xff1f; 4.1 系统化的…...

Centos7 搭建单机elasticsearch

以下是在 CentOS 7 上安装 Elasticsearch 7.17.7 的完整步骤&#xff1a;&#xff08;数据默认保存在/var/lib/elasticsearch下&#xff0c;自行更改&#xff09; 一、装 Java 环境 Elasticsearch 是用 Java 编写的&#xff0c;所以需要先安装 Java 运行环境。 检查系统中是…...

【前端】Bootstrap:JavaScript 组件与插件

Bootstrap 不仅提供了强大的 CSS 工具和组件&#xff0c;还内置了丰富的 JavaScript 组件和插件。这些 JavaScript 组件能够增强网页的交互性&#xff0c;让开发者在不编写大量 JavaScript 代码的情况下快速实现各种动态效果。Bootstrap 的 JavaScript 组件基于 jQuery&#xf…...

部署 Open WebUI

1. 安装docker 2.启动Hyper-v 3.下载 安装 WSL wsl --update wsl --install 4. 打开 DeskDocker 5. 打开 运行 ollama 参考 Windows 部署 ollama-CSDN博客 6. 部署 运行 open webui docker docker run -d -p 3000:8080 --add-hosthost.docker.internal:host-gateway -v o…...

HUAWEI_HCIA_实验指南_Lib2.1_交换机基础配置

1、原理概述 交换机之间通过以太网电接口对接时需要协商一些接口参数&#xff0c;比如速率、双工模式等。交换机的全双工是指交换机在发送数据的同时也能够接收数据&#xff0c;两者同时进行。就如平时打电话一样&#xff0c;说话的同时也能够听到对方的声音。而半双工指在同一…...

第4天:用户界面和布局补充材料——`activity_login.xml`解读

下面是对“第4天&#xff1a;用户界面和布局补充材料”该文学习的更深层次的补充材料&#xff0c;对 activity_login.xml 文件的理解。 下面对activity_login.xml’ 文件中每一行进行详细解释&#xff1a; <?xml version"1.0" encoding"utf-8"?>声…...

《深入浅出LLM基础篇》(五):Propmt工程优化

&#x1f389;AI学习星球推荐&#xff1a; GoAI的学习社区 知识星球是一个致力于提供《机器学习 | 深度学习 | CV | NLP | 大模型 | 多模态 | AIGC 》各个最新AI方向综述、论文等成体系的学习资料&#xff0c;配有全面而有深度的专栏内容&#xff0c;包括不限于 前沿论文解读、…...

基于WebSocket实现简易即时通讯功能

代码实现 pom.xml <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency><groupId>org.springframework.boot</groupId><artifa…...

2012年国赛高教杯数学建模D题机器人避障问题解题全过程文档及程序

2012年国赛高教杯数学建模 D题 机器人避障问题 图1是一个800800的平面场景图&#xff0c;在原点O(0, 0)点处有一个机器人&#xff0c;它只能在该平面场景范围内活动。图中有12个不同形状的区域是机器人不能与之发生碰撞的障碍物&#xff0c;障碍物的数学描述如下表&#xff1a…...

Pixel Dream Workshop 作品集:基于LSTM时序模型生成的动态艺术画展示

Pixel Dream Workshop 作品集&#xff1a;基于LSTM时序模型生成的动态艺术画展示 1. 当AI遇见艺术&#xff1a;LSTM如何创造动态视觉叙事 在数字艺术创作领域&#xff0c;时序模型正带来一场革命性的变化。Pixel Dream Workshop最新推出的动态艺术画系列&#xff0c;展示了长…...

用快马ai五分钟生成java学习路线可视化原型,清晰规划你的编程进阶之路

今天想和大家分享一个特别实用的Java学习路线可视化工具的开发过程。作为一个Java初学者&#xff0c;我经常被各种知识点搞得晕头转向&#xff0c;直到发现用InsCode(快马)平台可以快速搭建一个学习路线图&#xff0c;整个开发过程只用了不到半小时&#xff0c;效果却出奇地好。…...

YOLOv8自定义检测头踩坑记:手把手教你修复‘NotImplementedError: new_detect task‘错误

YOLOv8自定义检测头实战&#xff1a;从报错到修复的深度解析 当你在YOLOv8框架中尝试添加一个名为new_detect的自定义检测头时&#xff0c;突然遇到NotImplementedError: new_detect task错误&#xff0c;这可能会让你感到困惑。本文将带你深入理解YOLOv8的任务调度机制&#x…...

技术驱动B端拓客升级:号码核验行业的痛点突围与发展新路径,氪迹科技核验筛选算法系统,法人股东核验,阶梯式价格

在B端市场竞争愈发精细化的当下&#xff0c;拓客工作的核心竞争力已从“广撒网”转向“精准触达”&#xff0c;而企业核心决策人的有效联系方式&#xff0c;正是精准拓客的关键载体。号码核验作为拓客流程的前置核心环节&#xff0c;直接决定着拓客投入的回报效率&#xff0c;更…...

开源条码字体技术:如何通过字体文件彻底改变条码生成方式

开源条码字体技术&#xff1a;如何通过字体文件彻底改变条码生成方式 【免费下载链接】librebarcode Libre Barcode: barcode fonts for various barcode standards. 项目地址: https://gitcode.com/gh_mirrors/li/librebarcode 条码生成技术长期以来依赖专业软件和专用…...

告别Python环境依赖!用PyInstaller打包Tkinter/Selenium程序的最佳实践

告别Python环境依赖&#xff01;用PyInstaller打包Tkinter/Selenium程序的最佳实践 你是否遇到过这样的尴尬场景&#xff1f;精心开发的Python程序在本地运行完美&#xff0c;但分享给同事或客户时&#xff0c;对方却因为缺少Python环境或依赖库而无法使用。尤其当程序涉及图形…...

【人物传记】唯一一位两次获得诺贝尔物理学奖-约翰·巴

1 约翰巴丁简介 约翰巴丁&#xff08;英语&#xff1a;John Bardeen&#xff0c;1908年5月23日—1991年1月30日[6]&#xff09;是一名美国物理学家和工程师。他是唯一一个两度获得诺贝尔物理学奖的人&#xff1a;第一次是在1956年与威廉肖克利和沃尔特布拉顿一起发明晶体管&am…...

AD21实战:3种方法搞定Keepout和机械层互转,最后一种能救急

AD21实战&#xff1a;3种高效解决Keepout与机械层互转难题的方法 在PCB设计过程中&#xff0c;Keepout层和机械层的正确使用与转换是确保设计准确性的关键环节。许多工程师都遇到过这样的困境&#xff1a;当设计文件中包含复杂图形元素时&#xff0c;简单的层切换或属性批量修…...

Wan2.2-I2V-A14B文生视频入门必看:WebUI可视化操作+命令行示例详解

Wan2.2-I2V-A14B文生视频入门必看&#xff1a;WebUI可视化操作命令行示例详解 1. 快速了解Wan2.2-I2V-A14B Wan2.2-I2V-A14B是一款强大的文生视频模型&#xff0c;能够根据文本描述生成高质量视频内容。这个私有部署镜像专为RTX 4090D 24GB显存显卡优化&#xff0c;内置完整运…...

Unity引擎开发过的VR大场景项目有哪些?用到的网络技术,资源处理及热更新方案有哪些

我梳理了Unity引擎开发的VR大场景代表性项目&#xff0c;并从网络技术、资源处理、热更新方案三个核心技术维度进行了详细分析。一、代表性VR大场景项目 1. 基于VR的数字孪生智慧城市平台 开发方&#xff1a;香港理工大学温州技术创新研究院技术特点&#xff1a;整合GIS地理信息…...