news 2026/6/10 12:26:30

WebSocket 消息推送:Spring Boot + Vue3 实现一个“网页版即时聊天室”(附源码)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
WebSocket 消息推送:Spring Boot + Vue3 实现一个“网页版即时聊天室”(附源码)

💬 前言:为什么轮询 (Polling) 被淘汰了?

在 Web 1.0 时代,如果我们要实现“收到新消息提醒”,通常只能让前端每隔 2 秒发一次 HTTP 请求问后端:“有新消息吗?”
这叫短轮询

  • 缺点:服务器压力大,99% 的请求都是无用的,且消息有延迟。

到了 Web 2.0,WebSocket横空出世。
它像一条**“专线管道”,一旦建立连接,服务器就可以主动**把消息推给前端。

  • 优点:零延迟,服务器资源消耗极低,全双工通讯。

今天,我们就用最主流的Spring Boot + Vue3,在 30 分钟内手撸一个多人在线聊天室!


🏗️ 系统架构:一条永不断的线

我们要实现的功能:

  1. 用户登录(输入昵称)。
  2. 进入群聊,显示在线人数。
  3. 发送消息,所有人(包括自己)实时收到。

架构设计图:

WebSocket_Server_内存
1. 建立 WS 连接
1. 建立 WS 连接
2. 发送消息 Hello
3. 查找所有在线 Session
4. 推送消息
4. 推送消息
ConcurrentHashMap Session池
用户 A Vue3
Spring Boot 后端
用户 B Vue3

💻 后端实战:Spring Boot + WebSocket

不需要 Netty,Spring Boot 自带的 WebSocket 模块足够应对中小规模场景。

1. 引入依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency>
2. 开启支持 (WebSocketConfig.java)
@ConfigurationpublicclassWebSocketConfig{@BeanpublicServerEndpointExporterserverEndpointExporter(){returnnewServerEndpointExporter();}}
3. 核心服务 (WebSocketServer.java)

这是整个聊天室的心脏。

@ServerEndpoint("/ws/{username}")// 前端连接地址: ws://localhost:8080/ws/张三@Component@Slf4jpublicclassWebSocketServer{// 存放每个客户端对应的 WebSocketServer 对象privatestaticConcurrentHashMap<String,Session>onlineSessions=newConcurrentHashMap<>();@OnOpenpublicvoidonOpen(Sessionsession,@PathParam("username")Stringusername){onlineSessions.put(username,session);broadcast("系统消息: 欢迎用户 ["+username+"] 加入群聊!");}@OnClosepublicvoidonClose(@PathParam("username")Stringusername){onlineSessions.remove(username);broadcast("系统消息: 用户 ["+username+"] 已离开。");}@OnMessagepublicvoidonMessage(Stringmessage,Sessionsession,@PathParam("username")Stringusername){// 收到消息,转发给所有人broadcast("【"+username+"】: "+message);}// 群发消息辅助方法privatevoidbroadcast(Stringmsg){onlineSessions.forEach((user,session)->{try{session.getBasicRemote().sendText(msg);}catch(IOExceptione){e.printStackTrace();}});}}

🎨 前端实战:Vue 3 Composition API

Vue3 写 WebSocket 简直不要太丝滑。

<template><divclass="chat-box"><divclass="msg-list"ref="msgRef"><divv-for="msg in msgList":key="msg">{{ msg }}</div></div><divclass="input-area"><inputv-model="inputMsg"placeholder="输入消息..."/><button@click="sendMsg">发送</button></div></div></template><scriptsetup>import{ref,onMounted,onUnmounted}from'vue';constusername='User_'+Math.floor(Math.random()*1000);constsocketUrl=`ws://localhost:8080/ws/${username}`;constmsgList=ref([]);constinputMsg=ref('');letws=null;onMounted(()=>{initWebSocket();});constinitWebSocket=()=>{ws=newWebSocket(socketUrl);ws.onopen=()=>{msgList.value.push("✅ 连接服务器成功...");};ws.onmessage=(event)=>{// 收到后端推送的消息msgList.value.push(event.data);};};constsendMsg=()=>{if(ws&&inputMsg.value){ws.send(inputMsg.value);inputMsg.value='';}};onUnmounted(()=>{if(ws)ws.close();// 页面销毁时断开连接});</script>

🛡️ 进阶挑战:心跳检测与断线重连

在真实生产环境中,网络是不稳定的。如果用户断网了,WebSocket 连接会“假死”。
你需要实现心跳机制 (Heartbeat)

  1. Ping/Pong:前端每隔 30 秒发送一个 “PING”,后端回复 “PONG”。
  2. 断线重连:前端监听ws.onclose事件,如果非主动断开,则在 5 秒后尝试重新new WebSocket()

(这部分代码在下方的源码中均有体现)


🎁 源码推荐与下载

如果你想看企业级的 IM 架构(支持千万级并发、集群部署、Redis 存储离线消息),那么仅仅看 Spring Boot 原生 WebSocket 是不够的,你需要引入Netty

我为你精选了一个 GitHub 上1.4万+ Star的神级项目,它是 Java 领域即时通讯的标杆。

开源项目:CIM (Cross-platform Instant Messaging)

  • GitHub 地址https://github.com/crossoverJie/cim
  • 推荐理由
    1. 基于Netty + Spring Boot + Redis构建,性能吊打原生 WebSocket。
    2. 代码结构清晰,包含命令行客户端、Web 客户端、安卓客户端。
    3. 文档极其详细,适合做毕业设计或企业内部通讯系统的底座。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/9 16:33:16

豆包手机被微信「拒绝」后,阿里系 APP 被曝也禁止其登陆,如何看待这场「博弈」?核心矛盾是什么?

最近&#xff0c;豆包手机成为了全网热议的焦点。这款备受期待的 AI 手机在发布后短短几天内便遭遇了微信、淘宝等主流应用的封禁&#xff0c;不仅如此&#xff0c;其他阿里系应用也接连宣布禁止该设备登录。这一波波的封杀让无数网友感到震惊&#xff0c;更引发了关于技术、商…

作者头像 李华
网站建设 2026/6/9 6:14:59

字节跳动计算机使用智能体技术架构深度解析

字节跳动计算机使用智能体技术架构深度解析 【免费下载链接】UI-TARS-2B-SFT 项目地址: https://ai.gitcode.com/hf_mirrors/ByteDance-Seed/UI-TARS-2B-SFT 在人工智能从语言理解向自主操作演进的关键节点&#xff0c;字节跳动推出的计算机使用智能体&#xff08;Comp…

作者头像 李华
网站建设 2026/6/8 19:23:49

(新卷)产品模块算法检验(Java、Js、c\c++、python)

产品模块算法检验 在产品配置中&#xff0c;一个配置产品是由多个产品模块(CM)构成&#xff0c;每个CM有自身的算法&#xff0c;且模块间可能存在算法依赖。例如电脑产品是由主板、CPU日、显卡等CM构成。CPU模块(CM1)算法依赖主板模块(CM2)算法&#xff0c;记作CM2<-CM1,算法…

作者头像 李华
网站建设 2026/6/9 1:14:42

RTCP: 统计、同步与网络自适应

RTCP: 统计、同步与网络自适应 本文是 WebRTC 系列专栏的第十三篇,将深入剖析 RTCP 协议的工作原理,包括 Sender/Receiver Report、网络质量反馈以及音视频同步机制。 目录 RTCP 概述RTCP 包类型Sender Report (SR)Receiver Report (RR)丢包、带宽与延迟分析音视频同步 (Lip-S…

作者头像 李华
网站建设 2026/6/8 5:48:22

DuckDB嵌入式分析数据库终极指南:快速上手高性能数据处理

DuckDB嵌入式分析数据库终极指南&#xff1a;快速上手高性能数据处理 【免费下载链接】duckdb DuckDB is an in-process SQL OLAP Database Management System 项目地址: https://gitcode.com/GitHub_Trending/du/duckdb 在当今数据驱动的时代&#xff0c;嵌入式分析数据…

作者头像 李华
网站建设 2026/6/4 15:56:20

深入 Flutter 底层:自定义 RenderObject 实现高性能异形列表项

在 Flutter 开发中&#xff0c;我们常通过组合Container、ClipPath、CustomPaint等组件实现异形 UI&#xff08;如弧形背景、不规则卡片&#xff09;&#xff0c;但在列表场景下&#xff0c;这类方案往往存在重绘频繁、性能损耗大的问题。究其根本&#xff0c;是因为常规组件本…

作者头像 李华