使用WebFlux处理WebSocket连接的全生命周期案例
使用WebFlux处理WebSocket连接的全生命周期案例
简介:
在Web应用程序开发中,WebSocket是一种用于实现双向通信的协议。Spring WebFlux提供了对WebSocket的支持,使您能够轻松地处理WebSocket连接和消息。本博客将介绍如何使用WebFlux处理WebSocket连接和消息,以及其全部生命周期。
在Spring WebFlux中,您可以使用WebSocketHandler这是webflux集成websocket的全生命周期,包括从连接发送到释放的全周期,其他拓展功能可以自行添加:
package com.example.webfluxdemo.handler;import lombok.extern.slf4j.Slf4j;
import org.jetbrains.annotations.NotNull;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.socket.WebSocketHandler;
import org.springframework.web.reactive.socket.WebSocketMessage;
import org.springframework.web.reactive.socket.WebSocketSession;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;/*** @Author: kingdol* @Description: a test to websockthandler*/
@Component
@Slf4j
public class MyWebSocketHandler implements WebSocketHandler {@NotNull@Overridepublic Mono<Void> handle(WebSocketSession session) {return session.receive().doOnSubscribe(s -> {log.info("发起连接:{}", s);}).doOnTerminate(() -> {log.info("doOnTerminate");}).doOnComplete(() -> {log.info("doOnComplete");}).doOnCancel(() -> {log.info("doOnCancel");}).doOnNext(message -> {if (message.getType().equals(WebSocketMessage.Type.BINARY)) {log.info("收到二进制消息");BinaryMessageHandler(session, message);} else if (message.getType().equals(WebSocketMessage.Type.TEXT)) {String content = message.getPayloadAsText();log.info("收到文本消息:{}", content);TestMessageHandler(session, message);} else if (message.getType().equals(WebSocketMessage.Type.PING)) {log.info("收到ping消息");PingTypeHandler(session, message);} else if (message.getType().equals(WebSocketMessage.Type.PONG)) {log.info("收到pong消息");PongTypeHandler(session, message);}}).doOnError(e -> {e.printStackTrace();log.error("doOnError");}).doOnRequest(r -> {log.info("doOnRequest");}).then();}private void BinaryMessageHandler(WebSocketSession session, WebSocketMessage message) {}private void PongTypeHandler(WebSocketSession session, WebSocketMessage message) {}private void PingTypeHandler(WebSocketSession session, WebSocketMessage message) {}private void TestMessageHandler(WebSocketSession session, WebSocketMessage message) {session.send(Flux.just(session.textMessage(message.getPayloadAsText()))).subscribe();}
}
在上面的示例中,MyWebSocketHandler实现了WebSocketHandler接口,并重写了handle方法来处理WebSocket连接和消息。在handle方法中,我们订阅了接收到的消息流,并对每个消息进行处理。在处理消息时,我们将接收到的消息转换为大写形式,并将响应发送回客户端。
要在应用程序中使用该WebSocket处理程序,您需要进行一些配置。以下是一个简单的配置示例:
package com.example.webfluxdemo.config;import com.example.webfluxdemo.handler.MyWebSocketHandler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.reactive.handler.SimpleUrlHandlerMapping;
import org.springframework.web.reactive.socket.server.support.WebSocketHandlerAdapter;import java.util.HashMap;
import java.util.Map;@Configuration
public class WebSocketConfig {@Beanpublic MyWebSocketHandler myWebSocketHandler() {return new MyWebSocketHandler();}@Beanpublic SimpleUrlHandlerMapping webSocketHandlerMapping() {Map<String, MyWebSocketHandler> map = new HashMap<>();map.put("/websocket", myWebSocketHandler());SimpleUrlHandlerMapping handlerMapping = new SimpleUrlHandlerMapping();handlerMapping.setUrlMap(map);handlerMapping.setOrder(1);return handlerMapping;}@Beanpublic WebSocketHandlerAdapter handlerAdapter() {return new WebSocketHandlerAdapter();}
}
在上面的配置示例中,我们创建了一个WebSocketConfig类,并定义了myWebSocketHandler、webSocketHandlerMapping和handlerAdapter这三个Bean。myWebSocketHandler是我们之前编写的WebSocket处理程序,webSocketHandlerMapping用于将WebSocket处理程序映射到URL路径,handlerAdapter是用于适配WebSocket处理程序的适配器。
要启动应用程序并使用WebSocket连接,您需要在Spring Boot的启动类上添加@EnableWebFlux注解。
以上就是全生命周期的基本讲解,谢谢观看!
相关文章:
使用WebFlux处理WebSocket连接的全生命周期案例
使用WebFlux处理WebSocket连接的全生命周期案例 简介: 在Web应用程序开发中,WebSocket是一种用于实现双向通信的协议。Spring WebFlux提供了对WebSocket的支持,使您能够轻松地处理WebSocket连接和消息。本博客将介绍如何使用WebFlux处理WebS…...
【REST2SQL】10 REST2SQL操作指南
【REST2SQL】01RDB关系型数据库REST初设计 【REST2SQL】02 GO连接Oracle数据库 【REST2SQL】03 GO读取JSON文件 【REST2SQL】04 REST2SQL第一版Oracle版实现 【REST2SQL】05 GO 操作 达梦 数据库 【REST2SQL】06 GO 跨包接口重构代码 【REST2SQL】07 GO 操作 Mysql 数据库 【RE…...
199_二叉树的右视图
描述 给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。 思路 对树进行深度优先搜索,在搜索过程中,我们总是先访问右子树。那么对于每一层来说,…...
第七讲_css浮动
css浮动 1. 设置浮动2. 浮动的特点3. 浮动的影响4. 解决浮动的影响4.1 解决父元素高度塌陷的问题4.2 解决对兄弟元素影响问题 1. 设置浮动 浮动是通过float属性设置,float取值范围: none:不浮动,默认值。left:向左浮…...
2024秋招,顺丰科技测试开发工程师一面
前言 今天回顾一下,一个被捞的全流程面试经历 时间线 9月21日测评 10月26日技术一面,本来是11点半开始,我正做另一个笔试呢,突然给我打电话开面 20分钟结束,一开始以为KPI,结果给过了 10月31日技术二…...
基于apache的http文件服务配置
背景: 公司的产品使用的第三方模组可以OTA,厂家提供的是window开启软件,这样就可以在本机做http下载服务器,然后使用端口映射的方式,公开到外网,这样就可以进行4G网络访问内网服务器了。但这个有个弊端&am…...
连铸工艺和模铸工艺有什么区别。
问题描述:连铸工艺和模铸工艺有什么区别。 问题解答: 连铸工艺和模铸工艺在多个方面存在显著差异: 指代不同: 模铸是成批大量生产锻件的锻造方法。连铸即为连续铸钢的锻造方法。 工艺不同: 模铸在锻压机械的作用…...
pyqt treeWidget树生成
生成treeWidget树与获取treeWidget树节点的数据 # encodingUTF-8 import sys from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QApplication, QTreeWidgetItem, QLineEdit, QSpinBox, QComboBox from PyQt5.QtWidgets import QWidget from release_test import Ui_F…...
DataFunSummit:2023年云原生大数据峰会:核心内容与学习收获(附大会核心PPT下载)
随着数字化转型的深入推进,大数据技术已经成为企业获取竞争优势的关键因素之一。本次峰会汇聚了业界顶尖的大数据专家、企业领袖和技术精英,共同探讨云原生大数据领域的最新技术和趋势。本文将深入分析峰会的核心内容,并探讨参会者从中能学到…...
docker 容器添加指定网络地址
docker 容器添加指定网络地址 在搭建halo博客时,准备让 halo、mysql8.1、nginx 三个容器在同一个网段中,并指定IP。 实现docker内部容器之间网络互通。 查看容器网络信息命令 docker inspect 容器名各容器部署成功后网络效果如下: nginx …...
后端怎样防止重复提交订单?
参考文章 通常我们可以在前端通过防抖和节流来解决短时间内请求重复提交的问题, 如果因网络问题、Nginx重试机制、微服务Feign重试机制或者用户故意绕过前端防抖和节流设置,直接频繁发起请求,都会导致系统防重请求失败,甚至导致后…...
数据结构之二叉搜索树
二叉搜索树 满足条件: 1.对于根节点:左子树中所有节点的值小于右子树中所有节点的值 2.任意节点的左右子树也是二叉搜索树,同样满足条件1 二叉搜索树的常用操作 我们将二叉搜索树封装为一个类 BinarySearchTree ,并声明一个成员变…...
《设计模式的艺术》笔记 - 抽象工厂模式
介绍 提供了一个创建一系列相关或相互依赖的对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,它是一种对象创建型模式。 在抽象工厂模式中,每个具体工厂都提供了多个工厂方法用于产生多种不同类型的产品,这些产品构…...
7.11、Kali Linux中文版虚拟机安装运行教程
目录 一、资源下载准备工作 二、安装教程 三、kali linux换源 四、apt-get update 报错 一、资源下载准备工作 linux 中文版镜像历史版本下载:http://old.kali.org/kali-images/ 大家可以自行选择版本下载,本人下载的是2021版本 二、安装教程 打开vmvare wokst…...
Go+快速开始详细指南
Go快速开始 Go编程语言是为工程、STEM教育和数据科学设计的。 对于工程:用儿童能掌握的最简单的语言工作。对于STEM教育:学习一门可以在未来工作中使用的工程语言。对于数据科学:用同一种语言与工程师交流。 安装方法 现在,我们建议您从源代码安装Go。 注意:需…...
SQL:一行中存在任一指标就显示出来
当想要统计的两个指标不在一张表中时,需要做关联。但很多情况下,也没有办法保证其中一张表的维度是全的,用left join或right join可能会导致数据丢失。所以借助full join处理。 1)如,将下面的数据处理成表格中的效果&…...
【代码随想录06】454. 四数相加 II 383. 赎金信 15. 三数之和 18. 四数之和
目录 454. 四数相加 II题目描述做题思路参考代码 383. 赎金信题目描述做题思路参考代码 15. 三数之和题目描述参考代码 18. 四数之和题目描述参考代码 454. 四数相加 II 题目描述 给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你…...
NodeJs 第十五章 session
Session代表服务器和客户端一次会话的过程。 在计算机科学领域来说,尤其是在网络领域,会话(session)是一种持久网络协议,在用户(或用户代理)端和服务器端之间创建关联,从而起到交换数据包的作用机制,session在网络协议…...
JRTP实时音视频传输(1)-必做的环境搭建与demo测试
1.需求 1)支持协议自动切换。在网络优的情况下使用TCP、网络差的情况下使用UDP,满足实时音视频传输需求, 2)支持RTCP ,流量控制,阻塞控制等。需要能支持RTCP,这样便能在这个基础上,…...
腿部臀部训练
坐式蹬腿器 100kg,是器械的极限了,也差不多是我的极限,深蹲是40kg,应该还可以加点,大腿外扩器55kg,没有尝试能不能做更重的,羡慕健身房里面的好身材的同学,自己得好好练 1.21健身房关…...
多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
