商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > 【Java】Websocket

【Java】Websocket

  发布于2026-07-11 阅读(0)

扫一扫,手机访问

WebSocket 在 Ja va 技术栈里的应用,早已不是什么新鲜事。但从实际开发来看,不少团队在集成时还是会踩一些配置或连接管理上的坑。今天正好借这个机会,把一套经过验证的 Spring Boot + WebSocket 实践方案完整梳理一遍。

依赖与基础配置

先把基础依赖拉进来。这部分没什么可说的,Spring Boot 官方 starter 已经封装得非常完善,直接引入 spring-boot-starter-websocket 即可。


    org.springframework.boot
    spring-boot-starter-websocket

依赖就位后,需要一个配置类来注册 WebSocket 的核心 Bean。这里要特别提一句:很多人漏掉 ServerEndpointExporter,结果服务端注解死活不生效。记住,这一步必须配好。

package com.sky.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;

/**
 * WebSocket配置类,用于注册WebSocket的Bean
 */
@Configuration
public class WebSocketConfiguration {

    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }

}

前端实现

前端这块,最核心的就是 WebSocket 对象的初始化和生命周期管理。直接贴一段经过简化的典型实现:




    
    WebSocket Demo


    
    
    
    

这里有个容易被忽视的细节:窗口关闭事件里一定要主动调用 websocket.close(),不然服务端会因为连接异常断开而抛出一堆没必要的报错。

WebSocket 服务端实现

服务端的核心逻辑都在 WebSocketServer 里。这个类通过 @ServerEndpoint("/ws/{sid}") 注解暴露端点,同时用 @OnOpen@OnMessage@OnClose 管理会话生命周期。

比较关键的一点是:每个客户端连接都需要映射到一个唯一的 Session 对象,这里用 sid 作为标识,存进 sessionMap 中。这样做的好处是后续按组发消息、定向推送都很方便。

package com.sky.websocket;

import org.springframework.stereotype.Component;
import ja vax.websocket.OnClose;
import ja vax.websocket.OnMessage;
import ja vax.websocket.OnOpen;
import ja vax.websocket.Session;
import ja vax.websocket.server.PathParam;
import ja vax.websocket.server.ServerEndpoint;
import ja va.util.Collection;
import ja va.util.HashMap;
import ja va.util.Map;

/**
 * WebSocket服务
 */
@Component
@ServerEndpoint("/ws/{sid}")
public class WebSocketServer {

    // 存放会话对象
    private static Map sessionMap = new HashMap();

    /**
     * 连接建立成功调用的方法
     */
    @OnOpen
    public void onOpen(Session session, @PathParam("sid") String sid) {
        System.out.println("客户端:" + sid + "建立连接");
        sessionMap.put(sid, session);
    }

    /**
     * 收到客户端消息后调用的方法
     * @param message 客户端发送过来的消息
     */
    @OnMessage
    public void onMessage(String message, @PathParam("sid") String sid) {
        System.out.println("收到来自客户端:" + sid + "的信息:" + message);
    }

    /**
     * 连接关闭调用的方法
     * @param sid
     */
    @OnClose
    public void onClose(@PathParam("sid") String sid) {
        System.out.println("连接断开:" + sid);
        sessionMap.remove(sid);
    }

    /**
     * 群发
     * @param message
     */
    public void sendToAllClient(String message) {
        Collection sessions = sessionMap.values();
        for (Session session : sessions) {
            try {
                // 服务器向客户端发送消息
                session.getBasicRemote().sendText(message);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

}

至于 sendToAllClient 方法,它的作用是广播消息——遍历所有活跃的 Session,逐条发送。当然,生产环境中可能还需要考虑连接断开后的清理、心跳检测等机制,这里作为演示已经足够。

定时推送任务

最后,配合定时任务能直接检验整个通道是否畅通。比如每隔 5 秒向所有在线客户端推送当前时间。

package com.sky.task;

import com.sky.websocket.WebSocketServer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import ja va.time.LocalDateTime;
import ja va.time.format.DateTimeFormatter;

@Component
public class WebSocketTask {

    @Autowired
    private WebSocketServer webSocketServer;

    /**
     * 通过WebSocket每隔5秒向客户端发送消息
     */
    @Scheduled(cron = "0/5 * * * * ?")
    public void sendMessageToClient() {
        webSocketServer.sendToAllClient("这是来自服务端的消息:" 
            + DateTimeFormatter.ofPattern("HH:mm:ss").format(LocalDateTime.now()));
    }

}

测试时只需要打开前端页面,观察控制台或消息显示区域,就能确认整个链路是否工作正常。如果定时任务触发后前端能收到消息,说明从配置到连接再到消息推送,每一步都已跑通。

当然,这只是 WebSocket 在 Spring Boot 中的基础整合。实际生产场景中,你还会遇到认证鉴权、集群场景下的 session 共享、心跳保活等问题,但有了这套骨架,后续扩展会清晰很多。

本文转载于:https://blog.csdn.net/qq_55675216/article/details/146174647 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注