赞
踩
使用spring-boot-starter-websocket构建前后台通信。
1.导入spring-boot-starter-websocket的jar包
- <!-- websocket -->
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-websocket</artifactId>
- </dependency>
2.session信息维护类
- @Slf4j
- public class WebSocketSessionManager {
- /**
- * 保存连接 session 的地方
- */
- public static ConcurrentHashMap<String, WebSocketSession> SESSION_POOL = new ConcurrentHashMap<>();
-
- /**
- * 添加 session
- *
- * @param key
- */
- public static void add(String key, WebSocketSession session) {
- // 添加 session
- SESSION_POOL.put(key, session);
- }
-
- /**
- * 删除 session,会返回删除的 session
- *
- * @param key
- * @return
- */
- public static WebSocketSession remove(String key) {
- // 删除 session
- return SESSION_POOL.remove(key);
- }
-
- /**
- * 删除并同步关闭连接
- *
- * @param key
- */
- public static void removeAndClose(String key) {
- WebSocketSession session = remove(key);
- if (session != null) {
- try {
- // 关闭连接
- session.close();
- } catch (IOException e) {
- // todo: 关闭出现异常处理,添加错误处理逻辑
- e.printStackTrace();
- }
- }
- }
-
- /**
- * 获得 session
- *
- * @param key
- * @return
- */
- public static WebSocketSession get(String key) {
- // 获得 session
- return SESSION_POOL.get(key);
- }
- }
3.websocket消息处理类
- @Component
- @Slf4j
- public class WebSocketHandler extends AbstractWebSocketHandler {
-
- @Override
- public void afterConnectionEstablished(WebSocketSession session) throws Exception {
- //socket连接成功后触发
- log.info("建立websocket连接");
- WebSocketSessionManager.add(session.getId(), session);
- }
-
- @Override
- protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
- // 客户端发送普通文件信息时触发
- log.info("发送文本消息");
- // 获得客户端传来的消息
- String payload = message.getPayload();
- log.info("服务端接收到消息 " + payload);
- }
-
- @Override
- protected void handleBinaryMessage(WebSocketSession session, BinaryMessage message) throws Exception {
- //客户端发送二进信息是触发
- log.info("发送二进制消息");
- }
-
- @Override
- public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
- //异常时触发
- log.error("异常处理");
- WebSocketSessionManager.removeAndClose(session.getId());
- }
-
- @Override
- public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
- // socket连接关闭后触发
- log.info("关闭websocket连接");
- WebSocketSessionManager.removeAndClose(session.getId());
- }
- }
4.websocket配置类
- @Configuration
- @EnableWebSocket
- public class WebSocketConfig implements WebSocketConfigurer {
-
- @Autowired
- private WebSocketHandler webSocketHandler;
-
- @Override
- public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
- registry
- .addHandler(webSocketHandler, "/msg")//websocket连接地址 ws://localhost:8080/msg
- //允许跨域,方便本地调试,生产建议去掉
- .setAllowedOrigins("*");
- }
- }
5.websocket操作相关服务类
- @Service
- @Slf4j
- public class WebSocketService {
-
- /**
- * 发送消息
- *
- * @param session
- * @param text
- * @return
- * @throws IOException
- */
- public void sendMsg(WebSocketSession session, String text) throws IOException {
- session.sendMessage(new TextMessage(text));
- }
-
- /**
- * 广播消息
- *
- * @param text
- * @return
- * @throws IOException
- */
- public void broadcastMsg(String text) throws IOException {
- for (WebSocketSession session : WebSocketSessionManager.SESSION_POOL.values()) {
- session.sendMessage(new TextMessage(text));
- }
- }
-
- }
6.项目启动类
- @SpringBootApplication
- @EnableScheduling
- public class WebSocketApplication {
-
- public static void main(String[] args) {
- SpringApplication.run(WebSocketApplication.class, args);
- }
-
- }
7.定时测试向浏览器发送消息类
- @Slf4j
- @Component
- public class MessageJob {
- @Autowired
- WebSocketService webSocketService;
-
- /**
- * 每5s发送
- */
- @Scheduled(cron = "0/2 * * * * *")
- public void run(){
- try {
- webSocketService.broadcastMsg("服务端消息 " + LocalDateTime.now().toString());
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
8.启动如报如下错误,增加定时任务配置类
org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'defaultSockJsTaskScheduler' is expected to be of type 'org.springframework.scheduling.TaskScheduler' but was actually of type 'org.springframework.beans.factory.support.NullBean'
- @Configuration
- public class ScheduledConfig {
-
- @Bean
- public TaskScheduler taskScheduler() {
- ThreadPoolTaskScheduler scheduling = new ThreadPoolTaskScheduler();
- scheduling.setPoolSize(10);
- scheduling.initialize();
- return scheduling;
- }
- }
9.测试http://coolaf.com/tool/chattest在线工具进行调试
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。