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
英文地址,請注明出處:http://en.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的架構分…