springboot websocket 知识点汇总

以下是一个详细全面的 Spring Boot 使用 WebSocket 的知识点汇总

1. 配置 WebSocket

添加依赖

进入maven官网, 搜索spring-boot-starter-websocket,选择版本, 然后把依赖复制到pom.xml的dependencies标签中

在这里插入图片描述

配置 WebSocket

创建一个配置类 WebSocketConfig,并启用 WebSocket 支持:

这个类的主要作用就是

  • 启用 WebSocket 支持: 这个配置类通过返回 ServerEndpointExporter 实例来启用 WebSocket 支持。
  • 自动注册端点: 它会自动注册用 @ServerEndpoint 注解标识的 WebSocket 端点,使它们能够处理 WebSocket 请求。
package com.example.websocketdemo.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;@Configuration
public class WebSocketConfig {@Beanpublic ServerEndpointExporter serverEndpointExporter() {return new ServerEndpointExporter();}
}

2. 创建 WebSocket 端点

创建一个 WebSocket 端点 WebSocketServer,处理客户端与服务器之间的 WebSocket 通信。

当一个用户向服务端发送socket连接时, 相当于创建了一个WebSocketServer 类的实例对象

代码中的Session 放到文章最后讲。

package com.example.websocketdemo.websocket;
import jakarta.websocket.*;
import jakarta.websocket.server.PathParam;
import jakarta.websocket.server.ServerEndpoint;
import org.springframework.stereotype.Component;@Component	// 下面路径最后面不要写 '/'这个符号
@ServerEndpoint("/websocket/{username}")	// 我们配置的有WebSocketConfig类, 所以可以使用这个注解
public class WebSocketServer {private Session session;@OnOpen	// 建立连接的时候会调用这个函数public void onOpen(Session session, @PathParam("username") String username) {this.session = session;System.out.println("Connected with username: " + username);}@OnMessage	// 接收到客户端的信息时调用public void onMessage(String message, Session session) {System.out.println("Received message: " + message);try {session.getBasicRemote().sendText("Server received [" + message + "]");} catch (IOException e) {e.printStackTrace();}}@OnClose	// 关闭连接的时候调用public void onClose(Session session) {System.out.println("Session closed");}@OnError	// 错误时调用public void onError(Session session, Throwable throwable) {throwable.printStackTrace();}
}

3. Spring Security 配置(可选)

如果你的应用使用了 Spring Security,可能需要配置忽略 WebSocket 端点的安全检查:

需要在你的SecurityConfig 类中添加下面内容才可以让服务器接收到websocket的请求。SecurityConfig是一个管理Spring Security的自定义类

package com.example.websocketdemo.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityCustomizer;@Configuration
public class SecurityConfig {@Beanpublic WebSecurityCustomizer webSecurityCustomizer() {return (web) -> web.ignoring().requestMatchers("/websocket/**");}
}

4. 客户端代码

可以使用 JavaScript 在前端与 WebSocket 服务器进行通信。

<script>let socket = null;function connect() {let username = "your user name";// @ServerEndpoint("/websocket/{username}")	这里也可以传递其他参数, 比如token, 它会被服务端的这个注解接收到socket = new WebSocket('ws://localhost:8080/websocket/' + username);// 建立连接时会调用socket.onopen = function(event) {};// 接收到服务端的信息时调用socket.onmessage = function(event) {};// 关闭连接时调用socket.onclose = function(event) {};// 错误时调用socket.onerror = function(event) {};// 也可以通过close()手动关闭连接, 他会调用onclose(), 一般vue中在取消挂在组件时手动关闭连接socket.close(); // 向服务端发送信息, message最好是json格式, JSON.stringify()socket.send(message)}
</script>

5. 处理 JSON 消息

在信息交换的时候, 我们一般用JSON格式的信息。Java 标准库中并不包含直接处理 JSON 的功能。因此,需要引入第三方库来处理 JSON 数据。
这里我们讲的是 Alibaba 提供的 fastjson, 还是在 maven官网 搜索 fastjson 选择对应版本, 引入到pom.xml的dependencies标签中。

// 将 Java 对象序列化为 JSON 字符串
String jsonString = JSON.toJSONString(user);// 将 JSON 字符串反序列化为 Java 对象
User deserializedUser = JSON.parseObject(jsonString, User.class);// 创建一个 JSONObject
JSONObject jsonObject = new JSONObject();
jsonObject.put("name", "John");
// 转换成JSON字符串
jsonObject.toString()// 解析 JSON 字符串
String jsonString = "{\"name\":\"ld\",\"age\":18,\"city\":\"ShangHai\"}";
JSONObject parsedObject = JSONObject.parseObject(jsonString);
// 获取value, 输出 ld
System.out.println("Name: " + parsedObject.getString("name"));

6. Session

Session 在 WebSocket 中是一个重要的概念,它代表了客户端和服务器之间的 WebSocket 连接。通过 Session 对象,你可以发送和接收消息、获取连接信息、管理连接状态以及处理连接中的错误。

1. 创建 WebSocket 服务器端点

在 Java 中使用 WebSocket 的第一步是创建一个 WebSocket 服务器端点。通过使用 @ServerEndpoint 注解,你可以定义 WebSocket 服务器端点,并处理连接、关闭、消息和错误事件。

示例代码

import jakarta.websocket.OnClose;
import jakarta.websocket.OnError;
import jakarta.websocket.OnMessage;
import jakarta.websocket.OnOpen;
import jakarta.websocket.Session;
import jakarta.websocket.server.ServerEndpoint;
import java.io.IOException;@ServerEndpoint("/websocket")
public class WebSocketServer {@OnOpenpublic void onOpen(Session session) {System.out.println("Connected: " + session.getId());}@OnMessagepublic void onMessage(String message, Session session) throws IOException {System.out.println("Received: " + message);session.getBasicRemote().sendText("Echo: " + message);}@OnClosepublic void onClose(Session session) {System.out.println("Disconnected: " + session.getId());}@OnErrorpublic void onError(Session session, Throwable throwable) {throwable.printStackTrace();}
}
2. Session 对象的常用方法
  • 获取连接的唯一 IDsession.getId()
  • 发送消息
    • 发送文本消息:session.getBasicRemote().sendText("message")
    • 发送二进制消息:session.getBasicRemote().sendBinary(ByteBuffer buffer)
  • 获取连接的基本信息
    • 获取连接的 URI:session.getRequestURI()
    • 获取连接的参数:session.getPathParameters()
    • 获取连接的请求参数:session.getRequestParameterMap()
  • 关闭连接session.close()
  • 检查连接状态session.isOpen()
3. 处理消息

在 WebSocket 中,处理消息是通过 @OnMessage 注解的方法实现的。你可以在这个方法中处理来自客户端的消息,并使用 Session 对象发送响应。

示例代码

@OnMessage
public void onMessage(String message, Session session) throws IOException {System.out.println("Received: " + message);// 向客户端发送回显消息session.getBasicRemote().sendText("Echo: " + message);
}
4. 处理连接和断开

@OnOpen@OnClose 注解的方法分别用于处理连接建立和连接断开事件。在这些方法中,你可以执行一些初始化或清理操作。

示例代码

@OnOpen
public void onOpen(Session session) {System.out.println("Connected: " + session.getId());
}@OnClose
public void onClose(Session session) {System.out.println("Disconnected: " + session.getId());
}
5. 处理错误

@OnError 注解的方法用于处理 WebSocket 连接中的错误。在这个方法中,你可以记录错误信息或执行其他的错误处理操作。

示例代码

@OnError
public void onError(Session session, Throwable throwable) {throwable.printStackTrace();
}

6. 使用 Session 进行高级操作

6.1 保存和共享用户状态

在 WebSocket 应用中,你可以使用 Session 对象来保存和共享用户状态。例如,你可以在 Session 对象中存储用户的身份信息,并在后续的消息处理中使用这些信息。

示例代码

@OnOpen
public void onOpen(Session session) {session.getUserProperties().put("username", "John");
}@OnMessage
public void onMessage(String message, Session session) throws IOException {String username = (String) session.getUserProperties().get("username");session.getBasicRemote().sendText("Hello, " + username + "! You sent: " + message);
}
6.2 广播消息

你可以使用 Session 对象的集合来实现消息的广播,即将消息发送给所有连接的客户端。

示例代码

import java.util.Collections;
import java.util.HashSet;
import java.util.Set;@ServerEndpoint("/websocket")
public class WebSocketServer {private static Set<Session> sessions = Collections.synchronizedSet(new HashSet<>());@OnOpenpublic void onOpen(Session session) {sessions.add(session);System.out.println("Connected: " + session.getId());}@OnClosepublic void onClose(Session session) {sessions.remove(session);System.out.println("Disconnected: " + session.getId());}@OnMessagepublic void onMessage(String message, Session session) throws IOException {for (Session s : sessions) {if (s.isOpen()) {s.getBasicRemote().sendText("Broadcast: " + message);}}}@OnErrorpublic void onError(Session session, Throwable throwable) {throwable.printStackTrace();}
}

文章到这里就这束了!~

其他文章地址:

快速入门,springboot知识点汇总

springboot常用注解大全(超详细, 30个)

springboot websocket知识点汇总

spring cloud知识点汇总, 待更

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

platformIO STM32 upload-“Failed to init device.”问题解决

因为发现自己的32板子有带自动下载功能&#xff0c;platformIO也支持串口下载&#xff0c;但一直提示这个问题 问题情况 问题解决 把BOOT0接3.3V&#xff0c;BOOT1接GND&#xff0c;再点击下载(之后接回去复位也可以显示) 这是我从一个有相同问题的人从他尝试过的解决方案中…

手动添加node包给nvm管理

1.下载二进制包文件&#xff1a;https://nodejs.org/zh-cn/download/prebuilt-binaries 2.解压后&#xff0c;改名为v20.15.1。 3.放入nvm文件夹下&#xff1a; 4.运行命令即可查看&#xff1a;nvm ls 5.命令大全&#xff1a; 更新 nvm&#xff1a; nvm install-latest-npm…

STL—string类—模拟实现

STL—string类—模拟实现 熟悉了string的结构和各自接口的使用之后&#xff0c;现在就要尝试去模拟实现string类 这个string类为了避免和我们库里的string类冲突&#xff0c;因此我们需要定义一个自己的命名空间 namespace wzf {class string{public://成员函数private://成…

java之 junit单元测试案例【经典版】

一 junit单元测试 1.1 单元测试作用 单元测试要满足AIR原则&#xff0c;即 A&#xff1a; automatic 自动化&#xff1b; I: Independent 独立性&#xff1b; R&#xff1a;Repeatable 可重复&#xff1b; 2.单元测试必须使用assert来验证 1.2 案例1 常规单元测试 1.…

H6392升压恒压芯片输入2.6V4.2V5V升压9V12V18V2.5Aic 制冷市场应用

在制冷市场应用中&#xff0c;H6392升压恒压芯片由于其多种特性和优势&#xff0c;可以找到多种应用场景。虽然直接提及“制冷市场”的具体应用可能不太常见&#xff0c;但我们可以从产品特征和典型应用中推导出一些潜在的应用场景。 制冷系统电子控制器供电&#xff1a;H6392…

让旧书重焕新生:旧书回收小程序开发

在这个数字化的时代&#xff0c;书籍依然是知识的重要载体&#xff0c;承载着无数的智慧与情感。然而&#xff0c;随着时间的推移&#xff0c;许多旧书被闲置在角落&#xff0c;逐渐被遗忘。为了让这些旧书重新发挥价值&#xff0c;我们致力于开发一款创新的旧书回收小程序&…

Re:从零开始的C++世界——类和对象(下)

文章目录 前言1.再谈构造函数&#x1f34e;构造函数体赋值&#x1f34e;初始化列表&#x1f34e;特性&#x1f34c;特性一&#x1f34c;特性二&#x1f34c;特性三&#x1f34c;特性四&#x1f34c;特性五 &#x1f34e;explicit 关键字 2.static成员&#x1f34e;概念&#x1…

ThinkBook_TypeC外接显卡突然无输出了怎么解决?这里有方法!

ThinkBook用了快一年了&#xff0c;使用群体蛮多&#xff01;速度和效果还是值得肯定。 但是这个外接显示器用着用着&#xff0c;偶尔就碰到无输出了&#xff01;在使用TypeC外接显卡的情况下! 这个问题我咨询过联想客服&#xff0c;一顿乱指导&#xff0c;方向根本不对&…

连接池应用

一、什么是连接池&#xff1a; 当应用程序需要执行数据库操作时&#xff0c;它会从连接池中请求一个可用的连接。如果连接池中有空闲的连接&#xff0c;那么其中一个连接会被分配给请求者。一旦数据库操作完成&#xff0c;连接不会被关闭&#xff0c;而是被归还到连接池中&…

【数据结构】非线性表----树详解

树是一种非线性结构&#xff0c;它是由**n&#xff08;n>0&#xff09;**个有限结点组成一个具有层次关系的集合。具有层次关系则说明它的结构不再是线性表那样一对一&#xff0c;而是一对多的关系&#xff1b;随着层数的增加&#xff0c;每一层的元素个数也在不断变化&…

Uniapp 组件 props 属性为 undefined

问题 props 里的属性值都是 undefined 代码 可能的原因 组件的名字要这样写&#xff0c;这个官方文档有说明

docker emqx 配置密码和禁用匿名连接

mqtt版本emqx/emqx:4.4.3 1.首先把镜像内目录/opt/emqx/etc拷贝到本地 2.做映射 3.allow_anonymous&#xff0c; false改成true 4. 5.MQTTX连不上的话看看下图的有没有打开

最优控制问题中的折扣因子

本文探讨了在线性二次型调节器&#xff08;LQR&#xff09;中引入折扣因子的重要性和方法。通过引入折扣因子&#xff0c;性能指标在无穷时间上的积分得以收敛&#xff0c;同时反映了现实问题中未来成本重要性递减的现象&#xff08;强化学习重要概念&#xff09;。详细推导了带…

《0基础》学习Python——第十六讲 __文件读写

<文件读写> 一、什么是文件读写 文件读写是指在Python程序中对文件进行读取和写入操作。通过文件读写&#xff0c;可以读取文件中的数据&#xff0c;或者向文件中写入数据。 Python提供了多种文件读写的方式&#xff0c;其中最常用的方式是使用open()函数打开一个文件&a…

uniapp打包h5,白屏并报错Failed to load resource: net::ERR_FILE_NOT_FOUND

在manifest.json内找到web配置修改运行的基础路径

9 Docker实践_安装JDK

欢迎来到一夜看尽长安花 博客&#xff0c;您的点赞和收藏是我持续发文的动力 对于文章中出现的任何错误请大家批评指出&#xff0c;一定及时修改。有任何想要讨论的问题可联系我&#xff1a;3329759426qq.com 。发布文章的风格因专栏而异&#xff0c;均自成体系&#xff0c;不足…

5G以太网和5G前传业务的有效解决方案——25G可调DWDM光模块

信息技术的迅猛发展和数据传输需求的不断增加&#xff0c;光通信技术在现代网络中扮演着至关重要的角色。DWDM技术通过在一根光纤上使用多个不同波长的光信号同时传输&#xff0c;大幅提高了数据传输的容量。而可调光模块则能够在多种波长之间进行切换&#xff0c;实现灵活、高…

昇思25天学习打卡营第14天|munger85

基于MindNLPMusicGen生成自己的个性化音乐 这个所谓的个性化的音乐就是指你输入一段文字它会根据这个文字输出一段音乐这个音乐是贴近于那段文字的所以叫做文生成音乐&#xff0c; 如果网络正常的话就可以直接从下载这个模型。 那么音乐生成的有两种方式呢有两种方式&#xff…

计算机网络基础:局域网、广域网及OSI七层模型解析

文章目录 一、局域网和广域网1、局域网&#xff08;LAN - Local Area Network&#xff09;2、广域网&#xff08;WAN - Wide Area Network&#xff09;3、对比局域网和广域网 二、OSI七层模型1、OSI的七层网络结构2、OSI的数据传输方式3、网络与操作系统的关系 一、局域网和广域…

基于自编码器和孪生框架的乳腺组织病理图像分类方法

乳腺癌组织病理图像的自动分类是计算机辅助诊断系统的重要任务之一。由于乳腺癌组织病理图像具有类间差异小、类内差异大的特点&#xff0c;提取用于乳腺癌分类的特征比较困难。为了解决这一问题&#xff0c;设计了一种改进的自编码器(AE)网络&#xff0c;该网络使用Siamese框架…