Javaweb使用websocket,请先连上demo好吧!很简单的!

Javaweb使用websocket

    • 先看结构及效果
    • MyWebSocketHandler用于处理消息
    • WebSocketConfig用于配置建联地址等
    • SchedulerConfig必须配置这个
    • MyWebSocketInterceptor建联的拦截器
    • SpringBootWebsocketApplication启动类
    • POM依赖
    • 展示效果
    • 源码

先看结构及效果

在这里插入图片描述

MyWebSocketHandler用于处理消息

package com.cili.learning.springbootwebsocket.websockethandler;import com.alibaba.fastjson.JSON;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.micrometer.core.instrument.util.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.*;
/*** @author 码头薯条Pro* @date 2025/7/14 23:30* <p></p>* <p>* 视频讲解链接:* <p>* 题解链接:* <p>* 题目链接:*/@Slf4j
public class MyWebSocketHandler extends TextWebSocketHandler {// 用于保存所有连接的会话private static final Set<WebSocketSession> sessions = Collections.synchronizedSet(new HashSet<>());@Overridepublic void afterConnectionEstablished(WebSocketSession session) throws Exception {String query = Objects.requireNonNull(session.getUri()).getQuery();Map<String, String> paramMap = splitQuery(query);String bondTypeListStr = paramMap.get("bondTypeList");if (StringUtils.isNotBlank(bondTypeListStr)) {ArrayList<String> bondTypeList = new ArrayList<>(Arrays.asList(bondTypeListStr.split(",")));session.getAttributes().put("bondTypeList", bondTypeList);}sessions.add(session);}private Map<String, String> splitQuery(String query) throws UnsupportedEncodingException {Map<String, String> query_pairs = new LinkedHashMap<>();if (query == null) return query_pairs;String[] pairs = query.split("&");for (String pair : pairs) {int idx = pair.indexOf("=");query_pairs.put(URLDecoder.decode(pair.substring(0, idx), "UTF-8"),URLDecoder.decode(pair.substring(idx + 1), "UTF-8"));}return query_pairs;}@Overridepublic void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {log.info("WEBSOCKET连接关闭了!");sessions.remove(session);}@Overridepublic void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {String payload = message.getPayload();if (StringUtils.isNotBlank(payload)) {Map params = new ObjectMapper().readValue(payload, Map.class);if (null != params && null != params.get("bondTypeList")) {session.getAttributes().put("bondTypeList", params.get("bondTypeList"));
//                session.sendMessage(new TextMessage("查询债券品种条件改为: " + params.get("bondTypeList")));}try {MyWebSocketHandler.sendMessageToAll("查询债券品种条件改为: " + params.get("bondTypeList"));} catch (Exception e) {e.printStackTrace();}}}// 服务器主动推送方法public static void sendMessageToAll(String message) throws Exception {synchronized (sessions) {for (WebSocketSession session : sessions) {if (session.isOpen()) {Object conditionObj = session.getAttributes().get("bondTypeList");List<String> bondTypeList = new ArrayList<>();if (conditionObj instanceof List) {bondTypeList = (List<String>) conditionObj;log.info("过滤条件是:{}", JSON.toJSONString(bondTypeList));}session.sendMessage(new TextMessage(message + JSON.toJSONString(bondTypeList)));}}}}
}

WebSocketConfig用于配置建联地址等

package com.cili.learning.springbootwebsocket.config;import com.cili.learning.springbootwebsocket.interceptor.MyWebSocketInterceptor;
import com.cili.learning.springbootwebsocket.websockethandler.MyWebSocketHandler;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;/*** @author 码头薯条Pro* @date 2025/7/14 23:35* <p></p>* <p>* 视频讲解链接:* <p>* 题解链接:* <p>* 题目链接:*/@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {@Overridepublic void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {registry.addHandler(new MyWebSocketHandler(), "/ws/test").addInterceptors(new MyWebSocketInterceptor()).setAllowedOrigins("*");}}

SchedulerConfig必须配置这个

package com.cili.learning.springbootwebsocket.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;/*** @author 码头薯条Pro* @date 2025/7/14 23:37* <p></p>* <p>* 视频讲解链接:* <p>* 题解链接:* <p>* 题目链接:*/@Configuration
public class SchedulerConfig {@Beanpublic ThreadPoolTaskScheduler taskScheduler() {ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();scheduler.setPoolSize(5);scheduler.setThreadNamePrefix("ws-sockjs-task-");scheduler.setRemoveOnCancelPolicy(true);return scheduler;}
}

MyWebSocketInterceptor建联的拦截器

package com.cili.learning.springbootwebsocket.interceptor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.http.server.ServletServerHttpRequest;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.server.HandshakeInterceptor;import javax.servlet.http.HttpServletRequest;
import java.util.Map;/*** @author 码头薯条Pro* @date 2025/7/14 23:36* <p></p>* <p>* 视频讲解链接:* <p>* 题解链接:* <p>* 题目链接:*/@Slf4j
public class MyWebSocketInterceptor implements HandshakeInterceptor {@Overridepublic boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response,WebSocketHandler wsHandler, Map<String, Object> attributes) {if (request instanceof ServletServerHttpRequest) {HttpServletRequest servletRequest = ((ServletServerHttpRequest) request).getServletRequest();String token = servletRequest.getHeader("User-Token");log.info("收到header token:" + token);// 放进attributes方便handler获取if (null != token) {attributes.put("token", token);}}return true; // 允许握手}@Overridepublic void afterHandshake(ServerHttpRequest request, ServerHttpResponse response,WebSocketHandler wsHandler, Exception exception) {}
}

SpringBootWebsocketApplication启动类

package com.cili.learning.springbootwebsocket;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;/*** @author 码头薯条Pro* @date 2025/7/14 23:17* <p></p>* <p>* 视频讲解链接:* <p>* 题解链接:* <p>* 题目链接:*/
@EnableScheduling
@SpringBootApplication
public class SpringBootWebsocketApplication {public static void main(String[] args) {SpringApplication.run(SpringBootWebsocketApplication.class, args);}}

POM依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.6.RELEASE</version></parent><groupId>com.cili.learn</groupId><artifactId>demo</artifactId><version>0.0.1-SNAPSHOT</version><name>spring-boot-websocket</name><description>springboot-websocket</description><properties><java.version>11</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>2.0.14</version> <!-- 建议使用最新稳定版 --></dependency><!-- lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.6</version><scope>provided</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-websocket</artifactId></dependency></dependencies><!-- <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>--></project>

展示效果

在这里插入图片描述

源码

https://gitee.com/coder-msc/cili-springboot-learning/tree/master/spring-boot-websocket

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

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

相关文章

文心大模型4.5开源测评:保姆级部署教程+多维度测试验证

前言&#xff1a;国产大模型开源的破局时刻 2025年6月百度文心大模型4.5系列的开源&#xff0c;标志着国产AI从"技术跟跑"向"生态共建"的关键跨越。 文心大模型4.5是百度自主研发的新一代原生多模态基础大模型&#xff0c;通过多个模态联合建模实现协同优…

前端学习5:Float学习(仅简单了解,引出flex)

一、Float基础概念1. 设计初衷&#xff1a; float最初是为实现文字环绕图片的效果&#xff08;类似杂志排版&#xff09;&#xff0c;后来被开发者用来做页面布局。2. 核心特性&#xff1a;使元素脱离普通文档流&#xff08;但仍在DOM中&#xff09;元素会向左/右浮动&#xff…

08-自然壁纸实战教程-视频列表-云

08-自然壁纸实战教程-视频列表 前言 视频列表页面本质上也是一个数据展示的列表&#xff0c;不同之处在于之前是是展示壁纸&#xff0c;Image组件负责渲染&#xff0c;这里展示的是视频&#xff0c;使用Video组件&#xff0c;另外视频页面也实现了下载的基本功能&#xff0c;…

SCI特刊征稿

我们团队联合北京工业大学研究团队在SCI源刊CMC组织了特刊SI: Advanced Edge Computing and Artificial Intelligence in Smart Environment,主要收录边缘计算和人工智能方向的文章&#xff0c;欢迎领域专家和学者投稿&#xff0c;网址https://www.techscience.com/cmc/special…

DO,VO,DTO.....

在 Java 项目里&#xff08;尤其是 Spring、MyBatis 这类框架&#xff09;&#xff0c;经常会看到一堆以 O 结尾的类&#xff1a;VO、DO、DTO、BO、POJO……它们本质上都是普通的 Java Bean&#xff08;即 POJO&#xff09;&#xff0c;但职责和出现的位置不同。下面用“用户下…

数据结构之并查集和LRUCache

系列文章目录 数据结构之ArrayList_arraylist o(1) o(n)-CSDN博客 数据结构之LinkedList-CSDN博客 数据结构之栈_栈有什么方法-CSDN博客 数据结构之队列-CSDN博客 数据结构之二叉树-CSDN博客 数据结构之优先级队列-CSDN博客 常见的排序方法-CSDN博客 数据结构之Map和Se…

UE5多人MOBA+GAS 21、给升龙添加连段攻击,从角色的按下事件中传递事件给GA

文章目录给升龙制作可连段缓存下一连段用普攻键来触发升龙后续的连段在角色中发送按下普攻标签事件在升龙中接收按下事件&#xff0c;触发连段以及伤害和力量的传递最后在蓝图中设置一下升龙技能的完整代码给升龙制作可连段 给升龙技能添加一些连段 缓存下一连段 缓存下一连…

基于光栅传感器+FPGA+ARM的测量控制解决方案

基于光栅传感器结合FPGA与ARM的测量控制解决方案&#xff0c;通过硬件协同分工实现高精度、实时性及多场景适应性&#xff1a;⚙️ ‌一、系统架构分工‌‌传感层&#xff08;光栅传感器&#xff09;‌采用光栅尺输出正交脉冲信号&#xff0c;分辨率达0.5μm&#xff0c;精度1μ…

NW831NW910美光固态闪存NW887NW888

美光固态闪存深度解析&#xff1a;NW831、NW910、NW887、NW888系列全方位评测一、技术根基与架构创新美光NW系列固态闪存的技术突破源于其先进的G9 NAND架构&#xff0c;该架构采用5纳米制程工艺和多层3D堆叠技术&#xff0c;在单位面积内实现了高达256层的存储单元堆叠&#x…

reasense api 文档

API 架构 英特尔实感&#xff08;Intel RealSense™&#xff09;API 提供对深度摄像头流数据的配置、控制和访问功能。该 API 支持通过高层级 API 快速启用摄像头基础功能&#xff0c;或通过底层级 API 全面控制所有摄像头设置。请根据需求选择合适的 API&#xff1a; 高层级 P…

ArkTs实现骰子布局

Entry Component struct workA {// 定义6种颜色数组&#xff0c;使用ResourceColor类型确保颜色值合法性State color: ResourceColor[] [#ef2816, #f0a200, #6ab002, #005868, #41192e, #141411]// 定义公共样式装饰器&#xff0c;避免重复样式代码Stylesys() {// 白色圆形基础…

c语言内存函数以及数据在内存中的存储

代码见&#xff1a;登录 - Gitee.com 1. memcpy使用和模拟实现 strcpy&#xff0c;strncpy是拷贝字符串的&#xff0c;有局限性 函数原型&#xff1a; void * memcpy ( void * destination, const void * source, size_t num ); 功能&#xff1a; memcpy 是完成内存块拷⻉的…

Codeforces Round 787 (Div. 3)(A,B,C,D,E,F,G)

Codeforces Round 787 (Div. 3) - Codeforces A. Food for Animals 题意 有a袋狗粮,b袋猫粮,c袋通用粮食&#xff0c;问现在有x只狗y只猫,每一个动物都要吃一袋粮食,问粮食够不够吃 思路 首先肯定考虑猫吃猫粮&#xff0c;狗吃狗粮。然后再考虑如果不够吃的话才会去吃通用…

LLaMA-Factory的webui快速入门

一、webui的启动方式 LLaMA-Factory 支持通过 WebUI 零代码微调大语言模型。 在完成安装 后&#xff0c;您可以通过以下指令进入 WebUI: llamafactory-cli webui 使用上面命令启动服务后&#xff0c;即可使用默认7860端口进行访问。访问地址&#xff1a;http://ip:7860,截止…

【第四节】ubuntu server安装docker

首先更新软件源 sudo apt update sudo apt upgrade安装docker 下载 Docker 官方 GPG 密钥 # 1. 下载 Docker 官方 GPG 密钥 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg再次更新软件源…

Kubernetes的微服务

用控制器来完成集群的工作负载&#xff0c;那么应用如何暴漏出去&#xff1f;需要通过微服务暴漏出去后才能被访问Service是一组提供相同服务的Pod对外开放的接口。借助Service&#xff0c;应用可以实现服务发现和负载均衡。service默认只支持4层负载均衡能力&#xff0c;没有7…

退出登录后头像还在?这个缓存问题坑过多少前端!

目录 1. 为什么退出登录后头像还在&#xff1f; ① 缓存没清理干净 ② 头像URL没更新 ③ 后端会话失效&#xff0c;但静态资源可访问 2. 怎么解决&#xff1f;5种常见方案 ✅ 方案1&#xff1a;强制刷新页面&#xff08;简单粗暴&#xff09; ✅ 方案2&#xff1a;给头像…

Windows下白嫖ClaudeCode

我的邀请链接&#xff1a;https://anyrouter.top/register?afffMJn 我的邀请链接&#xff1a;https://anyrouter.top/register?afffMJn 我的邀请链接&#xff1a;https://anyrouter.top/register?afffMJn 兄弟们&#xff0c;交个朋友啊&#xff01;一定要用我的呀&#xff0…

windows在anaconda中下载安装fasttext

windows在anaconda中下载安装fasttext 1.访问fasttext-wheel&#xff0c;点击对应链接&#xff0c;下载对应Python版本、操作系统类型 的.whl文件&#xff1a; 链接地址&#xff1a;https://pypi.org/project/fasttext-wheel/#files 打开anaconda终端&#xff0c;切换到上面的…

mysql5.7系列-索引下推(cover_index)

什么是索引下推 ICP&#xff08;Index Condition Pushdown&#xff09;是在MySQL 5.6版本上推出的查询优化策略&#xff0c;把本来由Server层做的索引条件检查下推给存储引擎层来做&#xff0c;以降低回表和访问存储引擎的次数&#xff0c;提高查询效率。 回顾下mysql的架构分…