springboot 使用websocket

简介:在springboot中使用websocket

1、引入依赖

java 复制代码
<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

2、创建ServerEndpoint服务

java 复制代码
@ServerEndpoint(value = "/websocket/team")
@Component
public class MyWebSocketHandler {


    //保存所有在线socket连接
    private static Map<String, MyWebSocketHandler> webSocketMap = new LinkedHashMap<>();

    //记录当前在线数目
    private static int count = 0;

    //当前连接(每个websocket连入都会创建一个MyWebSocket实例
    private Session session;

    //处理连接建立
    @OnOpen
    public void onOpen(Session session) {
        this.session = session;
        webSocketMap.put(session.getId(), this);
        addCount();
    }

    //接受消息
    @OnMessage
    public void onMessage(String message, Session session) {
        //从上下中获取对象 无法通过注解获取,因为websocket中会报空指针异常
        ApplicationContext context = ApplicationContextRegister.getApplicationContext();
        //将string转成JSON对象
        JSONObject entries = JSONUtil.parseObj(message);
        //将JSON对象转成bean对象
        WebsocketJson websocketJson = entries.toBean(WebsocketJson.class);
        switch (websocketJson.getType()) {
            case "1": {
                //创建房间
                BankFacadeServiceImpl facadeService = context.getBean(BankFacadeServiceImpl.class);
                //业务逻辑
                break;
            }
            case "2": {
                //加入队伍
                websocketJson.setSessionId(session.getId());
                BankFacadeServiceImpl facadeService = context.getBean(BankFacadeServiceImpl.class);
                //业务逻辑
                break;
            }
            case "3": {
                //退出队伍
                websocketJson.setSessionId(session.getId());
                BankFacadeServiceImpl facadeService = context.getBean(BankFacadeServiceImpl.class);
                //业务逻辑
                break;
            }
            case "4": {
                //创建试卷
                BankFacadeServiceImpl facadeService = context.getBean(BankFacadeServiceImpl.class);
                //业务逻辑
                break;
            }
            case "5": {
                //业务逻辑
                break;
            }
            case "6": {
                //业务逻辑
                break;
            }
            case "7":{
                try {
                    sendMessage("心跳检测");
                }catch (Exception e){
                    System.out.println(e.getMessage());
                }
                break;
            }
        }

    }

    //处理错误
    @OnError
    public void onError(Throwable error, Session session) {
//        log.info("发生错误{},{}",session.getId(),error.getMessage());
    }

    //处理连接关闭
    @OnClose
    public void onClose() {
        webSocketMap.remove(this.session.getId());
        reduceCount();
    }

    //组队消息
    public void sendMessageJson(WebsocketJson message, MyWebSocketHandler handler) {
        try {
            if (handler == null) {
                this.session.getBasicRemote().sendText(JSONUtil.toJsonStr(JSONUtil.parse(message)));
            } else {
                handler.sendMessage(JSONUtil.toJsonStr(JSONUtil.parse(message)));
            }
        } catch (IOException e) {
            System.out.println(e.getMessage());
            throw new RuntimeException(e);
        }

    }

    //发送消息
    public void sendMessage(String message) throws IOException {
        this.session.getBasicRemote().sendText(message);
    }

    //广播消息
    public static void broadcast() {
        MyWebSocketHandler.webSocketMap.forEach((k, v) -> {
            try {
                v.sendMessage("这是一条测试广播");
            } catch (Exception e) {
            }
        });
    }

    //操作count,使用synchronized确保线程安全
    public static synchronized void addCount() {
        MyWebSocketHandler.count++;
    }

    public static synchronized void reduceCount() {
        MyWebSocketHandler.count--;
    }
}
相关推荐
程序员晓琪4 分钟前
约定大于配置:基于 Java 包名自动生成 API 版本路由的最佳实践
java·spring boot·后端
Flittly9 分钟前
【AgentScope Java新手村系列】(11)中断与恢复
java·spring boot·spring
银卡13 分钟前
RAG Embedding 模型选型
后端
用户5598224812214 分钟前
Claude Code + DeepSeek V4 Pro 说"不行"时,别信
后端
leeyi40 分钟前
Manus Agent:一个全能 AI,和一支研究团队
后端·aigc·agent
东坡白菜1 小时前
破局全栈:前端开发的Java入门实战记录—JPA(2)
java·后端
代码丰1 小时前
RAG 系统如何实现全链路追踪:AOP 埋点与流式调用追踪实践
后端
小码编匠1 小时前
C# 工控上位机必备:数据转换工具类与十个核心模块
后端·c#·.net
神奇小汤圆2 小时前
一文读懂 OpenAI Codex 源码的原理、架构与未来
后端
道友可好2 小时前
AI 是最好的混乱放大器:代码熵管理实战
前端·人工智能·后端