news 2026/7/3 16:59:19

WebSocket 连接完整流程连接建立阶段

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
WebSocket 连接完整流程连接建立阶段
<!-- websocket: 提供了对 WebSocket 协议的支持 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency>

简单的前后端WebSocket连接示例

WebSocket 连接完整流程

连接建立阶段

前端初始化:

后端接收连接:

@OnOpen public void onOpen(Session session, @PathParam("sid") String sid) { System.out.println("客户端:" + sid + "建立连接"); sessionMap.put(sid, session); }

连接确认:

消息交互阶段

前端发送消息:

function send(){ var message = document.getElementById('text').value; websocket.send(message); }

后端接收处理消息:

@OnMessage public void onMessage(String message, @PathParam("sid") String sid) { System.out.println("收到来自客户端:" + sid + "的信息:" + 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(); } } }

前端接收消息:

websocket.onmessage = function(event){ setMessageInnerHTML(event.data); } function setMessageInnerHTML(innerHTML){ document.getElementById('message').innerHTML += innerHTML + '<br/>'; }

连接关闭阶段

  1. 主动关闭:

    • 用户点击 "关闭连接" 按钮,触发closeWebSocket()函数

    • 调用websocket.close()方法关闭连接

function closeWebSocket() { websocket.close(); }
  1. 页面关闭时关闭连接:

    • 监听window.onbeforeunload事件,在页面关闭前主动关闭 WebSocket 连接

    • 防止连接未断开就关闭页面导致服务器抛出异常

window.onbeforeunload = function(){ websocket.close(); }

后端处理关闭:

@OnClose public void onClose(@PathParam("sid") String sid) { System.out.println("连接断开:" + sid); sessionMap.remove(sid); }

前端关闭回调

简单的代码实现

注册WebSocket的ServerEndpointExporter

@Configuration public class WebSocketConfiguration { /** * 注册WebSocket的ServerEndpointExporter * 扫描带有@ServerEndpoint注解的类,并注册成websocket服务 * * ServerEndpointExporter是Spring框架提供的一个用于支持WebSocket的核心组件,它的主要作用是: * 扫描并注册WebSocket端点:自动检测Spring容器中带有@ServerEndpoint注解的类,并将它们注册为WebSocket端点 * 创建和管理WebSocket实例:负责为每个WebSocket连接创建对应的端点实例 * 连接生命周期管理:处理WebSocket连接的建立、消息传输和关闭等生命周期事件 * * @return */ @Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); } }

定义WebSocket服务端组件

@Component @ServerEndpoint("/ws/{sid}") public class WebSocketServer { //存放会话对象 private static Map<String, Session> sessionMap = new HashMap(); /** * 连接建立成功调用的方法 */ @OnOpen public void onOpen(Session session, @PathParam("sid") String sid) { System.out.println("客户端:" + sid + "建立连接"); sessionMap.put(sid, session); } /** * 收到客户端消息后调用的方法 * * @param message 客户端发送过来的消息 */ @OnMessage public void onMessage(String message, @PathParam("sid") String sid) { System.out.println("收到来自客户端:" + sid + "的信息:" + message); } /** * 连接关闭调用的方法 * * @param sid */ @OnClose public 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(); } } } }

简单的前端

<!DOCTYPE HTML> <html> <head> <meta charset="UTF-8"> <title>WebSocket Demo</title> </head> <body> <input id="text" type="text" /> <button οnclick="send()">发送消息</button> <button οnclick="closeWebSocket()">关闭连接</button> <div id="message"> </div> </body> <script type="text/javascript"> var websocket = null; var clientId = Math.random().toString(36).substr(2); //判断当前浏览器是否支持WebSocket if('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("连接成功");
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/3 7:27:49

变量与算数表达式

回顾这个问题的我们应该怎样去解决呢&#xff1f;我的标注&#xff0c;就是需要解决问题的原因&#xff1a;一、问题首先出现main函数这一行。二、main未命名类型。然后进行修改&#xff0c;第一次的训练是比较简单呢&#xff0c;主要代码的类别&#xff0c;以及代码的规范。第…

作者头像 李华
网站建设 2026/7/1 2:08:47

脑手分离:Agent系统的基础设施进化

一个被迫的架构选择 想象这样一个场景&#xff1a;你的Agent系统在生产环境里跑了一天&#xff0c;突然容器崩溃了。不是业务逻辑的问题&#xff0c;就是这个容器死了。最恐怖的不是容器重启——而是会话丢失了。用户的整个工作上下文、已执行的步骤、中间结果&#xff0c;全部…

作者头像 李华
网站建设 2026/7/1 2:08:36

北斗赋能海洋精准定位

海洋定位导航&#xff08;PNT&#xff09;正从传统的卫星导航向综合PNT体系演进&#xff0c;旨在实现全域、全时、无缝、高精度的定位导航授时服务。其发展现状与核心瓶颈如下&#xff1a; 一、发展现状 当前发展的核心是构建“天、空、地、海、水下”一体化的综合PNT体系&am…

作者头像 李华
网站建设 2026/7/2 5:21:23

GESP2026年6月认证C++三级( 第三部分编程题(2、字符转换))精讲

&#x1f3f0;《字符王国大冒险》——大小写魔法师一、故事开始1、一天&#xff0c;小杨来到了一座神奇的城堡。城堡里住着三种居民。&#x1f451; 第一种&#xff1a;大写字母国A B C D E ...&#x1f338; 第二种&#xff1a;小写字母国a b c d e ...⭐ 第三种&#xff1a;数…

作者头像 李华
网站建设 2026/7/2 7:08:25

沈阳沈北新区奢侈品回收避坑要点分享新手必知实用技巧

导语在沈阳沈北新区&#xff0c;随着人们生活水平的提高&#xff0c;奢侈品的拥有量也在增加&#xff0c;闲置奢侈品回收需求日益增长。然而&#xff0c;回收市场鱼龙混杂&#xff0c;新手很容易掉入陷阱。优典奢品汇作为专业的奢侈品回收机构&#xff0c;深知其中门道。接下来…

作者头像 李华
网站建设 2026/7/1 2:06:37

机器人电源方案评审清单:别只看电压电流,还要看这 6 件事

1. 核心判断电源方案评审不能只确认电压、电流、功率参数是否匹配。机器人整机里的电源系统同时连接&#xff1a;负载组合、供电路径、上下电顺序、保护策略、接地与回流、通信/传感器/控制状态&#xff0c;以及整机验证工况。很多整机问题表面上是通信掉线、驱动报警、传感器跳…

作者头像 李华