当前位置: 首页 > news >正文

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.lryc.cn/news/588446.html

相关文章:

  • Vim库函数
  • 【DOCKER】-4 dockerfile镜像管理
  • 纯C++11实现!零依赖贝叶斯情感分析系统,掌握机器学习系统工程化的秘密!
  • 学习 Flutter (三):玩安卓项目实战 - 上
  • 机器学习、深度学习、神经网络之间的关系
  • redis配置(Xshell连接centos7的基础上)
  • Mysql数据库学习--多表查询
  • Python中使用Re模块TypeError: cannot use a string pattern on a bytes-like object 解决办法
  • Leaflet面试题及答案(81-100)
  • 九、官方人格提示词汇总(中-1)
  • 项目进度图不直观,如何优化展示方式
  • Go泛型完全指南:从基础到实战应用
  • 进程---基础知识+命令+函数(fork+getpid+exit+wait+exec)
  • iOS —— 网易云仿写
  • 短剧看广告APP源码独立部署与二次开发指南(支持二开)
  • 前端vue对接海康摄像头流程
  • Java学习 -------进程、线程、协程
  • 无人机抗风性模块概述!
  • 修改主机名颜色脚本
  • Pytest Fixtures 详解:轻松掌握测试逻辑复用与资源管理
  • 如何删除D盘合并C盘
  • 搭建k8s高可用集群,“Unable to register node with API server“
  • JAVA并发——volatile关键字的作用是什么
  • 【EM算法】算法及注解
  • aspnetcore Mvc配置选项中的ModelBindingMessageProvider
  • 群晖Nas - Docker(ContainerManager)上安装SVN Server和库权限设置问题
  • k8s-高级调度(二)
  • SVN客户端(TortoiseSVN)和SVN-VS2022插件(visualsvn)官网下载
  • Kotlin Map映射转换
  • LeetCode 424.替换后的最长重复字符