Spring WebSocket 像写http接口一样处理WebSocket消息(Stomp协议)

server/2025/3/14 17:02:53/

简单的WebSocket服务搭建

在聊Stomp协议之前,先看一下Spring boot使用比较原始的方法是怎么搭建WebSocket服务的

<dependency>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-websocket</artifactId>  
</dependency>
@ServerEndpoint("/ws")
public class WebSocketTest {/*** 客户端和服务器建立连接后执行* @param session*/@OnOpenpublic void onOpen(Session session) {}/*** 客户端和服务器断开连接后执行* @param session*/@OnClosepublic void onClose(Session session) {}/*** 接收到客户端发送的消息时* @param message* @param session*/@OnMessagepublic void onMessage(String message, Session session) {//所有的消息都发送到这里,需要自己实现消息路由,将不同类型的消息转发到对应的模块处理}
}

传统方法代码很简单,如果没有复杂的业务逻辑,直接这样使用,在onMessage中处理业务逻辑完全没问题,但是如果消息种类多,业务复杂,那就需要自定义消息协议,实现对不同种类消息的处理

基于Stomp协议的WebSocket服务

如果不想自定义消息协议,怎么办?还好Spring WebSocket提供了对Stomp协议的支持,先上代码


/*** * WebSocket配置示例**/
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {@Autowiredprivate WebSocketChannelInterceptor channelInterceptor;@Overridepublic void registerStompEndpoints(StompEndpointRegistry registry) {registry//连接地址(比如ws://127.0.0.1:8080/ws).addEndpoint("/ws")//允许跨域.setAllowedOriginPatterns("*")//提高兼容性,某些老版本浏览器不支持WebSocket,则可以使用SockJS库实现,如果服务启用        SockJS,在使用Postman之类的工具建立连接时,需要在服务路径后加上/websocket.withSockJS();}@Overridepublic void configureMessageBroker(MessageBrokerRegistry registry) {//发送消息路径的前缀registry.setApplicationDestinationPrefixes("/app");}@Overridepublic void configureClientInboundChannel(ChannelRegistration registration) {//自定义的消息拦截器,用于鉴权等操作,如果不需要自定义拦截器,configureClientInboundChannel函数可以删掉registration.interceptors(channelInterceptor);}
}
/*** WebSocket消息处理,类似于Spring MVC中普通http接口的写法,只是注解从@RequestMapping换成了@MessageMapping* * @author longmap**/
@Component
@RestController
@MessageMapping("/msg/test")
public class MsgTestController {/*** 接收消息* @param protocolText 消息内容(Spring已经解析过Stomp协议了,这里收到的就是有效内容)*/@MessageMapping("/1")public void test1(String protocolText) {System.out.println(protocolText);}
}

只需要上面两段代码,就可以实现不同类型的消息发送到指定路径下处理,就和普通http接口一样

Stomp消息内容示例:

SEND
sendHeader:222222222
destination:/app/msg/test/1
content-length:8这是一条消息fgfsgfg


http://www.ppmy.cn/server/174934.html

相关文章

网络爬虫-1:发送请求+维持会话+代理设置/超时设置

1.基于get发送请求 2.基于post发送请求 3.维持会话 4.代理设置/超时设置 一.基于get发送请求 1.获取网页源码1 使用json库中的json.loads(),将json格式的字符串变为Python的字典形式 以下通过http://httpbin.org/get网址进行基本练习操作 import requests import json urlh…

电力时间同步系统,京准电钟电子助力增效

电力时间同步系统&#xff0c;京准电钟电子助力增效 电力时间同步系统&#xff0c;京准电钟电子助力增效 电力时间同步系统是保障电网稳定运行的关键技术&#xff0c;其核心在于为全网的设备提供统一、高精度的时间基准。以下从技术方案、系统设计要点及挑战与解决方案等方面…

【Linux 指北】常用 Linux 指令汇总

第一章、常用基本指令 # 注意&#xff1a; # #表示管理员 # $表示普通用户 [rootlocalhost Practice]# 说明此处表示管理员01. ls 指令 语法&#xff1a; ls [选项][目录或文件] 功能&#xff1a;对于目录&#xff0c;该命令列出该目录下的所有子目录与文件。对于文件&#xf…

Python中的Collections库

目录 defaultdict&#xff1a;默认值字典Counter&#xff1a;计数器deque&#xff1a;双端队列namedtuple&#xff1a;命名元组OrderedDict&#xff1a;有序字典ChainMap&#xff1a;链式字典UserDict/UserList/UserString&#xff1a;自定义容器基类 1. defaultdict&#xff…

【C++标准库类型】深入理解C++中的using声明:从基础到实践

目录 一、using声明基础 1.1 基本语法形式 1.2 典型应用场景 1.3 作用域规则 二、关键注意事项 2.1 命名冲突处理 2.2 头文件使用规范 2.3 与typedef的对比 三、面向对象中的应用 3.1. 解除派生类名称隐藏&#xff08;核心应用&#xff09; 3.2. 构造函数继承&#…

基于异构特征融合与轻量级集成学习的软件漏洞挖掘方案设计与Python实现

标题:基于异构特征融合与轻量级集成学习的软件漏洞挖掘方案设计与Python实现 一、方案设计原理 异构特征工程 静态特征:基于AST的代码属性图(CPG)解析(使用Joern+NetworkX)动态特征:内存访问模式分析(通过QEMU模拟执行)上下文特征:CWE漏洞模式匹配(集成Semgrep规则引…

使用1Panel一键搭建WordPress网站的详细教程(全)

嘿&#xff0c;各位想搭建自己网站的朋友们&#xff01;今天我要跟大家分享我用1Panel搭建WordPress网站的全过程。说实话&#xff0c;我之前对服务器运维一窍不通&#xff0c;但通过这次尝试&#xff0c;我发现原来建站可以这么简单&#xff01;下面是我的亲身经历和一些小技巧…

mysql经典试题共34题

1、准备数据 -- drop drop table if exists dept; drop table if exists emp; drop table if exists salgrade;-- CREATE CREATE TABLE dept (deptno int NOT NULL COMMENT 部门编号,dname varchar(14) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMM…