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://www.mzph.cn/diannao/46473.shtml

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

相关文章

mysql不初始化升级

1、下载mysql&#xff0c;下载地址&#xff1a;MySQL :: Download MySQL Community Server 2、解压下载好的mysql&#xff0c;修改配置文件的datadir指定目录为当前数据存储的目录 3、通过管理员cmd进入新版本mysql的bin目录&#xff0c; 然后执行命令安装mysql服务&#xff…

Facebook软体机器人与机器人框架:创新社交互动的未来

随着人工智能技术的不断进步&#xff0c;Facebook正通过软体机器人和先进的机器人框架&#xff0c;重新定义社交互动的未来。这些创新不仅提升了用户体验&#xff0c;也为开发者提供了强大的工具来构建下一代社交应用。 一、Facebook软体机器人&#xff1a;智能化的社交伙伴 …

【学习笔记】无人机(UAV)在3GPP系统中的增强支持(七)-通过无人机实现无线接入的独立部署

引言 本文是3GPP TR 22.829 V17.1.0技术报告&#xff0c;专注于无人机&#xff08;UAV&#xff09;在3GPP系统中的增强支持。文章提出了多个无人机应用场景&#xff0c;分析了相应的能力要求&#xff0c;并建议了新的服务级别要求和关键性能指标&#xff08;KPIs&#xff09;。…

JVM:垃圾回收器

文章目录 一、介绍二、年轻代-Serial垃圾回收器三、老年代-SerialOld垃圾回收器四、年轻代-ParNew垃圾回收器五、老年代-CMS&#xff08;Concurrent Mark Sweep&#xff09;垃圾回收器六、年轻代-Parllel Scavenge垃圾回收器七、Parallel Old垃圾回收器八、G1垃圾回收器 一、介…

仅在少数市场发售?三星Galaxy Z Fold 6 Slim折叠屏手机更轻更薄

在智能手机的创新之路上&#xff0c;三星一直是行业的领跑者之一。随着Galaxy Z Fold系列的不断进化&#xff0c;三星再次突破技术边界&#xff0c;推出了更为轻薄的Galaxy Z Fold 6 Slim。 这款新型折叠屏手机以其独特的设计和卓越的性能&#xff0c;为用户带来了全新的使用体…

[终端安全]-8 隐私保护和隐私计算技术

1 隐私保护相关法规和标准 1&#xff09;国内法规和标准 1.1&#xff09;中华人民共和国网络安全法&#xff08;2017年&#xff09; - 规定了个人信息的保护和数据安全的基本原则。 - 要求网络运营者采取措施防止数据泄露、篡改和丢失。 1.2&#xff09;信息安全技术&#x…

【Python】Gunicorn vs Uvicorn:如何选择适合你的 Python WSGI/ASGI 服务器

我白天是个 搞笑废物 表演不在乎 夜晚变成 忧伤怪物 撕扯着孤独 我曾经是个 感性动物 小心地感触 现在变成 无关人物 &#x1f3b5; 张碧晨/王赫野《何物》 在部署 Python Web 应用时&#xff0c;选择合适的服务器对应用的性能和稳定性至关重要。Gunicorn…

护眼台灯真的护眼吗?要注意学生如何正确使用台灯!

孩子们面临着越来越多的视力挑战&#xff0c;在近视学生中&#xff0c;近10%为高度近视&#xff0c;且占比随年级升高而增长。幼儿园6岁儿童中有1.5%为高度近视&#xff0c;而高中阶段则达到了17.6%。青少年是国家的未来和希望&#xff0c;而他们的视力健康却面临着前所未有的挑…

一篇讲清楚怎么选算力租赁平台

选择算力租赁平台时&#xff0c;需要考虑多个因素以确保找到最适合自己需求的服务。以下是一些关键点&#xff0c;可以帮助您做出明智的选择&#xff1a; 明确需求&#xff1a;首先&#xff0c;确定您的项目需要哪种类型的计算资源&#xff0c;比如CPU、GPU或FPGA&#xff0c;以…

Cadence23学习笔记(二)

原理图设计界面中就可以直接新建PCB: 亲测&#xff1a;需要画完原理图&#xff0c;并且DRC通过之后才可以&#xff01; 放置完元器件之后要规定元件的Footprint &#xff0c;注意PCB封装名要和库文件中的名字对应&#xff1a; DRC按钮&#xff1a; 点击图标 N, 生成第一网表&…

车载音视频MediaPlayer优化方案

媒体播放现状 从手机到车载&#xff0c;在很多地方还是有很大的不同。针对多媒体的场景Android车机目前大部分结构大致结构如下图&#xff1a; 从以上图看出的问题&#xff1a; 各个音视频APP单独实现播控界面&#xff0c;播放链路不一致&#xff0c;使用的底层播放器和音频焦…

基于Spring Boot的高校后勤餐饮管理系统

1 项目介绍 1.1 研究背景 “互联网”时代的到来&#xff0c;既给高校后勤管理发展带来了机遇&#xff0c;也带来了更大的挑战。信息化应用已经开始普及&#xff0c;传统的高校后勤餐饮管理模式往往存在着效率低下、信息不透明、资源浪费等问题&#xff0c;已经难以满足现代高…

Linux系统之部署经典魔塔小游戏

Linux系统之部署经典魔塔小游戏 一、魔塔小游戏介绍1.1 魔塔小游戏简介1.2 项目预览二、本次实践介绍2.1 本地环境规划2.2 本次实践介绍三、检查本地环境3.1 检查系统版本3.2 检查系统内核版本3.3 检查软件源四、安装Apache24.1 安装Apache2软件4.2 启动apache2服务4.3 查看apa…

如何使用断点续传方式上传大文件到阿里云 OSS

要使用断点续传方式上传大文件到阿里云 OSS&#xff0c;一般可以通过阿里云提供的 SDK 来实现。以下是使用 Java SDK 进行断点续传上传的示例代码&#xff0c;前提条件如下&#xff1a; 已创建存储空间&#xff08;bucket&#xff09;。具有oss:putObject权限。SDK 会将上传的状…

flask基础配置详情

前言 一个简单的应用 app Flask(__name__) app.route("/") def hello_world():return "<p>Hello,World!"运行Flask应用 #flask命令运行flask --app hello run#使用Python命令进行运行python -m flask # 作为一个捷径&#xff0c;如果文件名为 app…

STM32第十八课:SPIFlash

目录 需求一、SPI概要二、SPI配置1.开时钟2.配置IO3.配置&使能SPI 三、FLash操作函数1.SPI发送数据2.FLASH写使能3.FLASH等待操作完成4.FLASH页写操作5.FLASH读操作6.FLASH扇区擦除 四、需求实现 需求 通过SPI控制FLash进行数据的保存和删除。 一、SPI概要 在我们使用UA…

【python】OpenCV—European Article Number

参考学习来自&#xff1a;OpenCV基础&#xff08;25&#xff09;条码和二维码扫的生成与识别 1 条形码介绍 EAN-13是欧洲物品编码&#xff08;European Article Number&#xff09;的缩写&#xff0c;是一种广泛使用的条形码标准&#xff0c;特别是在超级市场和其它零售业中。…

【c++刷题笔记-动态规划】day38: 322. 零钱兑换 、 279.完全平方数 、139.单词拆分

322. 零钱兑换 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;完全背包&#xff0c;初始化为最大背包容量&#xff0c;当背包为0的时候有0枚硬币 重点&#xff1a;dp[i-coins[j]]1,统计个数 class Solution { public:int coinChange(vector<int>& coin…

OpenCV解决验证码(数字和字母)识别(Python)

文章目录 前言一、准备验证码图片 前言 OpenCV是一个基于Apache2.0许可&#xff08;开源&#xff09;发行的跨平台计算机视觉和机器学习软件库。它支持Windows、Linux、Mac OS、Android和iOS等多个操作系统&#xff0c;提供了丰富的图像处理和计算机视觉功能&#xff0c;包括但…

WINUI——实现点在直线上随意移动

开发环境 VS2022 .net core6 需求 需要在一条直线上可随意移动一个点&#xff0c;这个点一定要在这条直线上&#xff0c;不可移出直线。也就是说A点到B点的直线就是这个点的移动范围。 需求深入分析 这个需求看上去&#xff0c;感觉完全可以使用Slider实现&#xff0c;因为…