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();
                    }
                }
            }
        }
    

}

测试

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

相关推荐
slacker-kian3 分钟前
[笔记]-什么是相似性搜索?
python·ai·向量·相似性搜索·点积·l2 距离·余弦相似度和距离
阿童木写作8 分钟前
跨境电商图片翻译工具,批量翻译视频字幕还免费
python·音视频
sukioe9 分钟前
城智连响:基于 LangGraph 与四库分层架构的城市公共设施智能报修与派单系统
人工智能·python·ai·架构·langchain
我的xiaodoujiao11 分钟前
Django 基础知识详细图文教程 4-Django 视图定义与使用
开发语言·数据库·后端·测试工具·django·sqlite
vipxieliang23 分钟前
收货地址验证完整方案:省市区与详细地址
java·spring boot
Apifox25 分钟前
Apifox 8 月更新|调试、权限与协作体验持续优化
前端·后端·测试
kyson_27 分钟前
后端登录凭证设计:Session-Cookie、Redis-Token 与 JWT
后端
对象存储与RustFS28 分钟前
RustFS 后台扫描器与自愈调参:五档速度、位腐检测周期与并发上限
后端·rust·开源
天天喝旺仔38 分钟前
Docker 镜像瘦身实战:多阶段构建把体积缩小 90%
运维·后端·ci/cd·docker·云原生·容器·性能优化
Lost of 程序猿43 分钟前
ASP.NET Core Saga 分布式事务深度实战:备件采购跨服务长流程,如何保证“要么全成,要么全回“
分布式·后端·asp.net