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

Javaweb使用websocket

先看结构及效果

MyWebSocketHandler用于处理消息

java 复制代码
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<>());

    @Override
    public 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;
    }

    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
        log.info("WEBSOCKET连接关闭了!");
        sessions.remove(session);
    }

    @Override
    public 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用于配置建联地址等

java 复制代码
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 {
    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(new MyWebSocketHandler(), "/ws/test")
                .addInterceptors(new MyWebSocketInterceptor())
                .setAllowedOrigins("*");
    }

}

SchedulerConfig必须配置这个

java 复制代码
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 {
    @Bean
    public ThreadPoolTaskScheduler taskScheduler() {
        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
        scheduler.setPoolSize(5);
        scheduler.setThreadNamePrefix("ws-sockjs-task-");
        scheduler.setRemoveOnCancelPolicy(true);
        return scheduler;
    }
}

MyWebSocketInterceptor建联的拦截器

java 复制代码
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 {
    @Override
    public 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; // 允许握手
    }

    @Override
    public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response,
                               WebSocketHandler wsHandler, Exception exception) {
    }
}

SpringBootWebsocketApplication启动类

java 复制代码
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 复制代码
<?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

相关推荐
leoFY1231 小时前
STM32H750配置LAN PHY芯片LAN8742
网络·stm32·嵌入式硬件
阿部多瑞 ABU2 小时前
AI红队攻防演化史(2023-2026):从虚拟角色到RLHF劫持——所有攻击方法全景总结与最新趋势分析
网络·人工智能·安全
博客-小覃2 小时前
Zabbix之华为交换机的日志记录信息操作详细教程
服务器·网络·华为·zabbix
stolentime2 小时前
FreeDomain 本地开发环境快速搭建指南
运维·服务器·网络
ytdbc3 小时前
OSPF综合实验
网络
kaisun644 小时前
Docker 构建网络问题排查
网络·docker·eureka
雪度娃娃5 小时前
存储器层次结构——磁盘硬盘存储
服务器·网络·数据库·计算机组成原理
YUANQIANG20245 小时前
通信领域进行蒙特卡洛仿真的思路和步骤
网络
eam0511235 小时前
OSPF综合实验
网络
QQ15401828565 小时前
USB转千兆以太网芯片方案
网络·pt153s·千兆以太网芯片·usb转以太网·千兆网口芯片