WebSorcket 集成 Spring Boot

WebSorcket 集成 Spring Boot

配置

java 复制代码
@Configuration
public class WebSocketConfiguraion {
    @Bean
    public ServerEndpointExporter serverEndpointExporter (){

        ServerEndpointExporter exporter = new ServerEndpointExporter();

        return exporter;
    }
}

服务类

java 复制代码
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.CopyOnWriteArraySet;

@Component
@ServerEndpoint("/websocket")
@Slf4j
public class WebSocketServer {
    
        /**
         * 线程安全的无序的集合
         */
        private static final CopyOnWriteArraySet<Session> SESSIONS = new CopyOnWriteArraySet<>();

        /**
         * 存储在线连接数
         */
        private static final Map<String, Session> SESSION_POOL = new HashMap<>();

        @OnOpen
        public void onOpen(Session session, @PathParam(value = "userId") String userId) {
            try {
                SESSIONS.add(session);
                SESSION_POOL.put(userId, session);
                log.info("【WebSocket消息】有新的连接,总数为:" + SESSIONS.size());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        @OnClose
        public void onClose(Session session) {
            try {
                SESSIONS.remove(session);
                log.info("【WebSocket消息】连接断开,总数为:" + SESSIONS.size());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        @OnMessage
        public void onMessage(String message) {
            log.info("【WebSocket消息】收到客户端消息:" + message);
        }

        /**
         * 此为广播消息
         *
         * @param message 消息
         */
        public void sendAllMessage(String message) {
            log.info("【WebSocket消息】广播消息:" + message);
            for (Session session : SESSIONS) {
                try {
                    if (session.isOpen()) {
                        session.getAsyncRemote().sendText(message);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }

        /**
         * 此为单点消息
         *
         * @param userId  用户编号
         * @param message 消息
         */
        public void sendOneMessage(String userId, String message) {
            Session session = SESSION_POOL.get(userId);
            if (session != null && session.isOpen()) {
                try {
                    synchronized (session) {
                        log.info("【WebSocket消息】单点消息:" + message);
                        session.getAsyncRemote().sendText(message);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }

        /**
         * 此为单点消息(多人)
         *
         * @param userIds 用户编号列表
         * @param message 消息
         */
        public void sendMoreMessage(String[] userIds, String message) {
            for (String userId : userIds) {
                Session session = SESSION_POOL.get(userId);
                if (session != null && session.isOpen()) {
                    try {
                        log.info("【WebSocket消息】单点消息:" + message);
                        session.getAsyncRemote().sendText(message);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    

}

测试

注意:项目安全框架白名单放行

相关推荐
智码看视界几秒前
现代Web开发基础:全栈工程师的起航点
前端·后端·c5全栈
程序员cxuan3 分钟前
Claude Fable 5 来了
人工智能·后端·程序员
biter down11 分钟前
从 0 到 1 搭建 Python 接口自动化测试框架(博客系统实战)
开发语言·python
JS菌16 分钟前
手写一个 AI Agent 全栈项目:从沙箱执行到子智能体的完整实现
前端·人工智能·后端
wang090744 分钟前
自己动手写一个spring之IOC_2
java·后端·spring
来杯@Java1 小时前
学生选课管理系统(基于springboot+vue前后端分离的项目)计算机毕业设计java
java·spring boot·spring·vue·毕业设计·maven·mybatis
ltl1 小时前
推理退化:为什么大模型会输出乱码、死循环和无意义文本
后端
ltl1 小时前
架构视图与文档:C4 模型从入门到实战
后端
肖永威2 小时前
Python多业务并行计算框架插件化演进:从硬编码到动态注册
python·插件化·并行计算·动态注册
yz_aiks2 小时前
Linux Jar包配置Systemd自启动实战:从排查到配置全流程
linux·python·jar·自启动·systemd