发布于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(),不然服务端会因为连接异常断开而抛出一堆没必要的报错。
服务端的核心逻辑都在 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 共享、心跳保活等问题,但有了这套骨架,后续扩展会清晰很多。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8