Spring Boot实战:如何高效集成非轮询WebSocket业务功能?

2026-05-25 23:471阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计744个文字,预计阅读时间需要3分钟。

Spring Boot实战:如何高效集成非轮询WebSocket业务功能?

目录 + 后端代码 + 前端代码 + 总结 + 后端代码 + 首先添加pom文件依赖 + dependency + groupId: org.springframework.boot + artifactId: spring-boot-starter-websocket + !-- + version: 1.3.5.RELEASE + --+ + /dependency + 添加配置类

目录
  • 后端代码
  • 前段代码
  • 总结

后端代码

首先加入pom文件

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> <!-- <version>1.3.5.RELEASE</version> --> </dependency>

加入配置类

@Configuration public class WebSocketConfig { /** * 注入ServerEndpointExporter, * 这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint */ @Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); } }

加入连接发送消息方法

@Component @ServerEndpoint("/websocket/{userName}") // 此注解相当于设置访问URL public class WebSocket { private Session session; private static CopyOnWriteArraySet<WebSocket> webSockets = new CopyOnWriteArraySet<>(); private static Map<String, Session> sessionPool = new HashMap<String, Session>(); private final static Logger logger = LoggerFactory.getLogger(LoginIntercept.class); @OnOpen public void onOpen(Session session, @PathParam(value = "userName") String userName) { this.session = session; webSockets.add(this); if (sessionPool.containsKey(userName)) { sessionPool.put(userName + String.valueOf(session.getId()), session); } else { sessionPool.put(userName, session); } logger.info("有新的连接,总数为:" + webSockets.size()); } @OnClose public void onClose() { webSockets.remove(this); logger.info("连接断开,总数为:" + webSockets.size()); } @OnMessage public void onMessage(String message) { logger.info("收到客户端消息:" + message); } /** * 功能描述: 此为广播消息 * * @param: [message] (消息) * @return: void () */ public void sendAllMessage(String message) { for (WebSocket webSocket : webSockets) { logger.info("广播消息:" + message); try { if (webSocket.session.isOpen()) { webSocket.session.getAsyncRemote().sendText(message); } } catch (Exception e) { e.printStackTrace(); } } } /** * 功能描述:此为单点消息 (发送文本) 现在可以发送给多客户端 * * @param: [userName, message] (接收人,发送消息) * @return: void () */ public void sendTextMessage(String userName, String message) { // 遍历sessionPool for (String key : sessionPool.keySet()) { // 存在当前用户 if (key.toString().indexOf(userName) != -1) { Session session = sessionPool.get(key); if (session != null && session.isOpen()) { try { session.getAsyncRemote().sendText(message); } catch (Exception e) { e.printStackTrace(); } } } } } /** * 功能描述: 此为单点消息 (发送文本) 现在可以发送给多客户端 * * @param: [userName, message] (接收人,发送消息) * @return: void () */ public void sendObjMessage(String userName, Object message) { // 遍历sessionPool for (String key : sessionPool.keySet()) { // 存在当前用户 if (key.toString().indexOf(userName) != -1) { Session session = sessionPool.get(key); if (session != null && session.isOpen()) { try { session.getAsyncRemote().sendObject(message); } catch (Exception e) { e.printStackTrace(); } } } } } }

发送信息

@RestController @RequestMapping("websocket") public class WebSocketController { @GetMapping("setMessage") @ApiOperation(value = "发送信息接口", notes = "发送信息接口") public Result webSocket(@ApiParam(name = "定时任务日志实体", value = "定时任务日志实体", required = false) @RequestBody MessageVO messageVO) { Result result = new Result(); String userName = messageVO.getUserName(); String message = messageVO.getMessage(); WebSocket webSocket = new WebSocket(); webSocket.sendTextMessage(userName, message); return result; } }

前段代码

import sysConfig from "../config"; import {Notification} from 'element-ui'; import {EVENT_TYPE} from "../const"; export function openSocket(userId) { let ws = new WebSocket(`${sysConfig.SOCKET_URL}/${userId}`); // let ws = new WebSocket(`ws://121.40.165.18:8800`); ws.onopen = function (evt) { Notification({ title: '欢迎回来!', message: `${sysConfig.SOCKET_URL}/${userId}` }); }; ws.onmessage = function (e) { console.log(typeof e.data); try{ if(e.data!=undefined || e.data!=null){ let json= JSON.parse(e.data); Notification({ title: json.messageTitle, message: json.messageText }); //通知页面更新 window.postMessage(EVENT_TYPE.updateMessage,'/'); } }catch(err){ console.log("webSocke异常,异常信息:"+err) } //ws.close(); }; ws.onclose = function (evt) { console.log('Connection closed.'); }; }

总结

到此这篇关于springboot业务功能实战之告别轮询websocket集成使用的文章就介绍到这了,更多相关springboot websocket的集成使用内容请搜索自由互联以前的文章或继续浏览下面的相关文章希望大家以后多多支持自由互联!

Spring Boot实战:如何高效集成非轮询WebSocket业务功能?

本文共计744个文字,预计阅读时间需要3分钟。

Spring Boot实战:如何高效集成非轮询WebSocket业务功能?

目录 + 后端代码 + 前端代码 + 总结 + 后端代码 + 首先添加pom文件依赖 + dependency + groupId: org.springframework.boot + artifactId: spring-boot-starter-websocket + !-- + version: 1.3.5.RELEASE + --+ + /dependency + 添加配置类

目录
  • 后端代码
  • 前段代码
  • 总结

后端代码

首先加入pom文件

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> <!-- <version>1.3.5.RELEASE</version> --> </dependency>

加入配置类

@Configuration public class WebSocketConfig { /** * 注入ServerEndpointExporter, * 这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint */ @Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); } }

加入连接发送消息方法

@Component @ServerEndpoint("/websocket/{userName}") // 此注解相当于设置访问URL public class WebSocket { private Session session; private static CopyOnWriteArraySet<WebSocket> webSockets = new CopyOnWriteArraySet<>(); private static Map<String, Session> sessionPool = new HashMap<String, Session>(); private final static Logger logger = LoggerFactory.getLogger(LoginIntercept.class); @OnOpen public void onOpen(Session session, @PathParam(value = "userName") String userName) { this.session = session; webSockets.add(this); if (sessionPool.containsKey(userName)) { sessionPool.put(userName + String.valueOf(session.getId()), session); } else { sessionPool.put(userName, session); } logger.info("有新的连接,总数为:" + webSockets.size()); } @OnClose public void onClose() { webSockets.remove(this); logger.info("连接断开,总数为:" + webSockets.size()); } @OnMessage public void onMessage(String message) { logger.info("收到客户端消息:" + message); } /** * 功能描述: 此为广播消息 * * @param: [message] (消息) * @return: void () */ public void sendAllMessage(String message) { for (WebSocket webSocket : webSockets) { logger.info("广播消息:" + message); try { if (webSocket.session.isOpen()) { webSocket.session.getAsyncRemote().sendText(message); } } catch (Exception e) { e.printStackTrace(); } } } /** * 功能描述:此为单点消息 (发送文本) 现在可以发送给多客户端 * * @param: [userName, message] (接收人,发送消息) * @return: void () */ public void sendTextMessage(String userName, String message) { // 遍历sessionPool for (String key : sessionPool.keySet()) { // 存在当前用户 if (key.toString().indexOf(userName) != -1) { Session session = sessionPool.get(key); if (session != null && session.isOpen()) { try { session.getAsyncRemote().sendText(message); } catch (Exception e) { e.printStackTrace(); } } } } } /** * 功能描述: 此为单点消息 (发送文本) 现在可以发送给多客户端 * * @param: [userName, message] (接收人,发送消息) * @return: void () */ public void sendObjMessage(String userName, Object message) { // 遍历sessionPool for (String key : sessionPool.keySet()) { // 存在当前用户 if (key.toString().indexOf(userName) != -1) { Session session = sessionPool.get(key); if (session != null && session.isOpen()) { try { session.getAsyncRemote().sendObject(message); } catch (Exception e) { e.printStackTrace(); } } } } } }

发送信息

@RestController @RequestMapping("websocket") public class WebSocketController { @GetMapping("setMessage") @ApiOperation(value = "发送信息接口", notes = "发送信息接口") public Result webSocket(@ApiParam(name = "定时任务日志实体", value = "定时任务日志实体", required = false) @RequestBody MessageVO messageVO) { Result result = new Result(); String userName = messageVO.getUserName(); String message = messageVO.getMessage(); WebSocket webSocket = new WebSocket(); webSocket.sendTextMessage(userName, message); return result; } }

前段代码

import sysConfig from "../config"; import {Notification} from 'element-ui'; import {EVENT_TYPE} from "../const"; export function openSocket(userId) { let ws = new WebSocket(`${sysConfig.SOCKET_URL}/${userId}`); // let ws = new WebSocket(`ws://121.40.165.18:8800`); ws.onopen = function (evt) { Notification({ title: '欢迎回来!', message: `${sysConfig.SOCKET_URL}/${userId}` }); }; ws.onmessage = function (e) { console.log(typeof e.data); try{ if(e.data!=undefined || e.data!=null){ let json= JSON.parse(e.data); Notification({ title: json.messageTitle, message: json.messageText }); //通知页面更新 window.postMessage(EVENT_TYPE.updateMessage,'/'); } }catch(err){ console.log("webSocke异常,异常信息:"+err) } //ws.close(); }; ws.onclose = function (evt) { console.log('Connection closed.'); }; }

总结

到此这篇关于springboot业务功能实战之告别轮询websocket集成使用的文章就介绍到这了,更多相关springboot websocket的集成使用内容请搜索自由互联以前的文章或继续浏览下面的相关文章希望大家以后多多支持自由互联!

Spring Boot实战:如何高效集成非轮询WebSocket业务功能?