一. 与HTTP对比

WebSocket 是一种在单个 TCP 连接上实现全双工(双向)通信的网络协议,它解决了传统 HTTP 协议 “请求 - 响应” 模式的局限性,让客户端(如浏览器)和服务器能建立持久连接,实现实时数据交互。

HTTP是短链接且单向通信,只有客户端主动发请求,服务器才能被动响应,无法主动向客户端推数据。WebSocket是长连接且支持双向通信

WebSocket通过一次HTTP握手建立持久TCP连接,之后客户端与服务器可基于该连接全双工、实时双向收发数据,无需反复建立连接。

二. WebSocket的关键特性

  1. 全双工通信:客户端和服务器可同时发送数据,无需等待对方响应。
  2. 持久连接:连接建立后长期保持,除非主动断开(如客户端关闭页面、服务器重启)。
  3. 跨域支持:WebSocket 本身支持跨域(类似 CORS),可通过 Origin 请求头和服务器配置控制跨域权限。
  4. 支持二进制数据:不仅能传文本(如 JSON),还能直接传二进制数据(如图片、音频、视频流),比 HTTP 传输二进制更高效。
  5. 自动重连(需手动实现):原生 WebSocket 不支持自动重连,实际项目中需通过代码逻辑实现(如监听 onclose 事件,延迟后重新发起连接)。

三. WebSocket 的典型应用场景

只要涉及 “实时数据交互” 的场景,WebSocket 都是优选方案:

  • 即时通讯:在线聊天(如微信网页版、企业 IM)、客服对话。
  • 实时通知:订单状态更新(如 “订单已发货”)、消息推送(如点赞提醒)。
  • 实时数据展示:股票 / 数字货币行情、体育赛事比分、监控系统数据(如服务器 CPU 使用率)。
  • 协同工具:多人在线文档编辑(如腾讯文档)、白板协作。
  • 流媒体:低延迟的音视频通话(如 WebRTC 基于 WebSocket 做信令交互)、直播弹幕。

四. 实现步骤

1.前端(浏览器原生API)

浏览器内置WebSocket对象,可直接发送连接和处理数据。

这里以一个简单实现为例

<!DOCTYPE HTML>
<html>
<head><meta charset="UTF-8"><title>WebSocket Demo</title>
</head>
<body><input id="text" type="text" /><button onclick="send()">发送消息</button><button onclick="closeWebSocket()">关闭连接</button><div id="message"></div>
</body>
<script type="text/javascript">var websocket = null;var clientId = Math.random().toString(36).substr(2);//判断当前浏览器是否支持WebSocketif('WebSocket' in window){//连接WebSocket节点websocket = new WebSocket("ws://localhost:8080/ws/"+clientId);}else{alert('Not support websocket')}//连接发生错误的回调方法websocket.onerror = function(){setMessageInnerHTML("error");};//连接成功建立的回调方法websocket.onopen = function(){setMessageInnerHTML("连接成功");}//接收到消息的回调方法websocket.onmessage = function(event){setMessageInnerHTML(event.data);}//连接关闭的回调方法websocket.onclose = function(){setMessageInnerHTML("close");}//监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。window.onbeforeunload = function(){websocket.close();}//将消息显示在网页上function setMessageInnerHTML(innerHTML){document.getElementById('message').innerHTML += innerHTML + '<br/>';}//发送消息function send(){var message = document.getElementById('text').value;websocket.send(message);}//关闭连接function closeWebSocket() {websocket.close();}
</script>
</html>

2. 后端

2.1 导入WebSocket的maven坐标

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

2.2 导入WebSocket服务端组件WebSocketServer,用于和客户端通信

/*** WebSocket服务*/
@Component // 交给 Spring 管理
@ServerEndpoint("/ws/{sid}")
//声明这是一个 WebSocket 服务端,路径为 /websocket/{sid}(支持路径参数)
public class WebSocketServer {//存放会话对象private static Map<String, Session> sessionMap = new HashMap();/*** 连接建立成功调用的方法*/@OnOpenpublic void onOpen(Session session, @PathParam("sid") String sid) {System.out.println("客户端:" + sid + "建立连接");sessionMap.put(sid, session);}/*** 收到客户端消息后调用的方法* @param message 客户端发送过来的消息*/@OnMessagepublic void onMessage(String message, @PathParam("sid") String sid) {System.out.println("收到来自客户端:" + sid + "的信息:" + message);}/*** 连接关闭调用的方法* @param sid*/@OnClosepublic void onClose(@PathParam("sid") String sid) {System.out.println("连接断开:" + sid);sessionMap.remove(sid);}/*** 群发* @param message*/public void sendToAllClient(String message) {Collection<Session> sessions = sessionMap.values();for (Session session : sessions) {try {//服务器向客户端发送消息session.getBasicRemote().sendText(message);} catch (Exception e) {e.printStackTrace();}}}}

WebSocketServer的代码格式基本就是这样,可以根据需要自行修改。

2.3 导入配置类WebSocketConfiguration,注册WebSocket的服务端组件

/*** WebSocket配置类,用于注册WebSocket的Bean*/
@Configuration
public class WebSocketConfiguration {@Beanpublic ServerEndpointExporter serverEndpointExporter() {return new ServerEndpointExporter();}}

前端和后端建立 WebSocket 连接的过程可分为 “握手” 和 “连接维持” 两步:

  1. 握手阶段:前端通过 new WebSocket('ws://服务器地址') 发起 HTTP 升级请求,携带 Upgrade: websocket 等头信息;后端验证后返回 101 Switching Protocols 响应,完成协议切换。
  2. 连接维持:握手成功后,TCP 连接保持持久状态,双方通过 WebSocket 帧格式直接双向收发数据,直到某一方主动关闭连接。

核心流程:前端发 HTTP 请求(带升级标识)→ 2. 后端验证并返回 101 响应 → 3. 协议切换为 WebSocket → 4. 基于持久 TCP 连接双向通信。

2.4 导入定时任务类WebSocketTask,定时向客户端推送数据

这相当于一个案例,如何使用WebSocketServer。

@Component
public class WebSocketTask {@Autowiredprivate WebSocketServer webSocketServer;/*** 通过WebSocket每隔5秒向客户端发送消息*/@Scheduled(cron = "0/5 * * * * ?")public void sendMessageToClient() {webSocketServer.sendToAllClient("这是来自服务端的消息:" + DateTimeFormatter.ofPattern("HH:mm:ss").format(LocalDateTime.now()));}
}

当我们想向前端页面推送消息时WebSocketTask的方法sendMessageToClient,如果要传递一个对象,注意将其转换成json格式,例如:

 Map map = new HashMap();map.put("type", 2);//1表示来单提醒 2表示客户催单map.put("orderId", id);map.put("content", "订单号:" + orders.getNumber());String json = JSON.toJSONString(map);// 通过WebSocket向客户端浏览器推送消息webSocketServer.sendToAllClient(json);

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

架构选型:为何用对象存储替代HDFS构建现代数据湖

在过去十余年的大数据浪潮中&#xff0c;Hadoop及其核心组件HDFS&#xff08;Hadoop分布式文件系统&#xff09;无疑是整个技术生态的基石。它开创性地解决了海量数据的分布式存储难题&#xff0c;支撑了无数企业从数据中挖掘价值。然而&#xff0c;随着数据规模的指数级增长以…

智能养花谁更优?WebIDE PLOY技术与装置的结合及实践价值 —— 精准养护的赋能路径

一、WebIDEPLOY 技术支撑下的智能养花系统核心构成在 WebIDEPLOY 技术的框架下&#xff0c;智能养花装置形成了一套精准协同的闭环系统&#xff0c;其核心在于通过技术整合实现 “监测 - 决策 - 执行 - 远程交互” 的无缝衔接&#xff0c;让植物养护更贴合城市居民的生活节奏。…

基于llama.cpp在CPU环境部署Qwen3

大家好,我是奇文王语,NLP爱好者,长期分享大模型实战技巧,欢迎关注交流。 最近两天在研究如何使用小规模参数的模型在CPU环境上进行落地应用,比如模型Qwen3-0.6B。开始使用Transformers库能够正常把模型服务进行部署起来,但是通过测试速度比较慢,用户的体验会比较差。 …

‌NAT穿透技术原理:P2P通信中的打洞机制解析‌

要说网络世界里的 “幕后功臣”&#xff0c;NAT 绝对得算一个&#xff0c;大家伙儿有没有琢磨过&#xff0c;为啥家里的电脑、手机&#xff0c;还有公司那一堆设备&#xff0c;都能同时连上网&#xff0c;还不打架呢&#xff1f; NAT 这东西&#xff0c;全名叫网络地址转换&am…

工业 5G + AI:智能制造的未来引擎

工业 5G AI&#xff1a;智能制造的未来引擎 文章目录工业 5G AI&#xff1a;智能制造的未来引擎摘要一、为什么工业需要 5G&#xff1f;二、工业 5G 的典型应用场景1. 智能制造工厂2. 远程控制与运维3. 智慧物流与仓储4. 能源、电力、矿山5. 智慧港口与交通三、成功案例解析1…

边缘计算设备 RK3576芯片

RK3576是瑞芯微&#xff08;Rockchip&#xff09;公司专为人工智能物联网&#xff08;AIoT&#xff09;市场精心设计的一款高算力、高性能及低功耗的国产化应用处理器。该处理器采用了先进的ARM架构&#xff0c;集成了四个ARM Cortex-A72高性能核心与四个ARM Cortex-A53高效能核…

ROS1系列学习笔记之T265的Python数据订阅显示、串口输出到凌霄飞控,以及开机自启动设置等一些问题处理方法(持续更新)

前言 关于T265的环境配置与安装&#xff0c;在前两期的ROS笔记中已经提及&#xff0c;包括英特尔本家的SDK安装&#xff0c;以及对应支持版本的ROS支持开发工具包。 ROS1系列学习笔记之Linux&#xff08;Ubuntu&#xff09;的环境安装、依赖准备、踩坑提示&#xff08;硬件以…

UART控制器——ZYNQ学习笔记14

UART 控制器是一个全双工异步收发控制器&#xff0c; MPSoC 内部包含两个 UART 控制器&#xff0c; UART0 和 UART1。每一个 UART 控制器支持可编程的波特率发生器、 64 字节的接收 FIFO 和发送 FIFO、产生中断、 RXD 和TXD 信号的环回模式设置以及可配置的数据位长度、停止位和…

C++ 登录状态机项目知识笔记

C 登录状态机项目知识笔记 1. 项目源码 1.1 login_state_machine.h #pragma once#include <string>// 登录状态枚举 enum class LoginState { IDLE, AUTHENTICATING, SUCCESS, FAILURE, LOCKED };// 登录事件枚举 enum class LoginEvent { REQUEST, SUCCESS, FAILURE, RE…

docker-nacos-v3

nacos官网&#xff1a; Redirecting to: https://nacos.io/ 服务发现和服务健康监测 Nacos 支持基于 DNS 和基于 RPC 的服务发现。服务提供者使用 原生SDK、OpenAPI、或一个独立的Agent TODO注册 Service 后&#xff0c;服务消费者可以使用DNS TODO 或HTTP&API查找和发现服…

DevOps 详解:文化、实践与工具链

目录一、DevOps 定义与核心目标二、DevOps 关键原则与实践1. 持续集成&#xff08;CI&#xff0c;Continuous Integration&#xff09;2. 持续交付&#xff08;CD&#xff0c;Continuous Delivery&#xff09;3. 持续部署&#xff08;Continuous Deployment&#xff09;4. 监控…

人工智能之数学基础:常用的连续型随机变量的分布

本文重点 本文将介绍概率中非常重要的连续型随机变量的分布,主要有均匀分布、指数分布、正态分布 均匀分布 若随机变量X的概率密度为: 如果概率密度函数如上所示,则称X服从区间[ a, b]上的均匀分布,记作X~U[a,b] 均匀分布的概率密度函数的计算如下: 指数分布 指数分布…

【开题答辩全过程】以 校园帮帮团跑腿系统的设计与实现为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人&#xff0c;语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…

Milvus 向量数据库开发实战指南

Milvus向量数据库是什么&#xff1f;-CSDN博客 一、核心概念解析 1.1 基础概念 1.1.1 Bitset&#xff08;位集&#xff09; 高效的数据表示方式&#xff0c;使用位数组替代传统数据类型 默认情况下&#xff0c;位值根据特定条件设置为 0 或 1 1.1.2 通道机制 PChannel&am…

vcruntime140.dll丢失解决办法

解决办法 安装Microsoft Visual C Redistributable https://learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist?viewmsvc-170

LabVIEW实现跨 VI 簇按钮控制功能

​在 LabVIEW 开发场景中&#xff0c;常需实现不同 VI 间的交互操作。本功能借助 VI Server 技术&#xff0c;突破 VI 边界&#xff0c;实现对目标 VI 中簇内按钮控件的属性读取与控制&#xff0c;为多 VI 协同、对VI里已经实现的功能&#xff0c;可以在其他VI中直接使用&#…

JS箭头函数

JavaScript 的箭头函数 (Arrow Function) 是 ES6 (ECMAScript 2015) 引入的一种重要的函数语法特性&#xff0c;它用更简洁的方式定义函数&#xff0c;并改变了 this 的绑定行为。 箭头函数和传统函数的主要区别&#xff1a;特性箭头函数传统函数语法更简洁&#xff0c;省略 fu…

linux内核 - 文件系统相关的几个概念介绍

介绍文件系统之前&#xff0c;先了解下存储管理的几个概念&#xff1a;1. 硬盘&#xff1a;是最底层的存储介质&#xff0c;比如 /dev/sda, /dev/nvme0n1. 一个物理硬盘就是一个块设备&#xff0c;未经处理是只能顺序读写二进制数据。 2. 分区&#xff1a;就是在硬盘上划分出不…

边缘计算(Edge Computing)+ AI:未来智能世界的核心引擎

边缘计算&#xff08;Edge Computing&#xff09; AI&#xff1a;未来智能世界的核心引擎 文章目录边缘计算&#xff08;Edge Computing&#xff09; AI&#xff1a;未来智能世界的核心引擎摘要什么是边缘计算&#xff1f;为什么需要边缘计算&#xff1f;1. 延迟问题2. 带宽压力…

计算机视觉与深度学习 | ORB-SLAM3算法原理与Matlab复现指南

文章目录 一、算法核心原理 1.1 系统架构概述 1.2 数学模型基础 1.2.1 状态估计框架 1.2.2 视觉-惯导融合模型 1.3 关键创新点 二、关键模块实现细节 2.1 ORB特征提取与匹配 2.2 地图初始化 2.3 视觉-惯导融合 2.4 回环检测与优化 三、Matlab复现思路 3.1 系统模块划分 3.2 核心…