springboot业务功能实战(四)告别轮询,websocket的集成使用

举报
小鲍侃java 发表于 2021/09/10 22:18:57 2021/09/10
【摘要】 后端代码 首先加入pom文件 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket...

后端代码

首先加入pom文件


  
  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-websocket</artifactId>
  4. <!-- <version>1.3.5.RELEASE</version> -->
  5. </dependency>

加入配置类


  
  1. @Configuration
  2. public class WebSocketConfig {
  3. /**
  4. * 注入ServerEndpointExporter,
  5. * 这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint
  6. */
  7. @Bean
  8. public ServerEndpointExporter serverEndpointExporter() {
  9. return new ServerEndpointExporter();
  10. }
  11. }

加入连接发送消息方法


  
  1. @Component
  2. @ServerEndpoint("/websocket/{userName}")
  3. // 此注解相当于设置访问URL
  4. public class WebSocket {
  5. private Session session;
  6. private static CopyOnWriteArraySet<WebSocket> webSockets = new CopyOnWriteArraySet<>();
  7. private static Map<String, Session> sessionPool = new HashMap<String, Session>();
  8. private final static Logger logger = LoggerFactory.getLogger(LoginIntercept.class);
  9. @OnOpen
  10. public void onOpen(Session session, @PathParam(value = "userName") String userName) {
  11. this.session = session;
  12. webSockets.add(this);
  13. if (sessionPool.containsKey(userName)) {
  14. sessionPool.put(userName + String.valueOf(session.getId()), session);
  15. } else {
  16. sessionPool.put(userName, session);
  17. }
  18. logger.info("【websocket消息】有新的连接,总数为:" + webSockets.size());
  19. }
  20. @OnClose
  21. public void onClose() {
  22. webSockets.remove(this);
  23. logger.info("【websocket消息】连接断开,总数为:" + webSockets.size());
  24. }
  25. @OnMessage
  26. public void onMessage(String message) {
  27. logger.info("【websocket消息】收到客户端消息:" + message);
  28. }
  29. /**
  30. * 功能描述: 此为广播消息
  31. *
  32. * @param: [message] (消息)
  33. * @return: void ()
  34. */
  35. public void sendAllMessage(String message) {
  36. for (WebSocket webSocket : webSockets) {
  37. logger.info("【websocket消息】广播消息:" + message);
  38. try {
  39. if (webSocket.session.isOpen()) {
  40. webSocket.session.getAsyncRemote().sendText(message);
  41. }
  42. } catch (Exception e) {
  43. e.printStackTrace();
  44. }
  45. }
  46. }
  47. /**
  48. * 功能描述:此为单点消息 (发送文本) 现在可以发送给多客户端
  49. *
  50. * @param: [userName, message] (接收人,发送消息)
  51. * @return: void ()
  52. */
  53. public void sendTextMessage(String userName, String message) {
  54. // 遍历sessionPool
  55. for (String key : sessionPool.keySet()) {
  56. // 存在当前用户
  57. if (key.toString().indexOf(userName) != -1) {
  58. Session session = sessionPool.get(key);
  59. if (session != null && session.isOpen()) {
  60. try {
  61. session.getAsyncRemote().sendText(message);
  62. } catch (Exception e) {
  63. e.printStackTrace();
  64. }
  65. }
  66. }
  67. }
  68. }
  69. /**
  70. * 功能描述: 此为单点消息 (发送文本) 现在可以发送给多客户端
  71. *
  72. * @param: [userName, message] (接收人,发送消息)
  73. * @return: void ()
  74. */
  75. public void sendObjMessage(String userName, Object message) {
  76. // 遍历sessionPool
  77. for (String key : sessionPool.keySet()) {
  78. // 存在当前用户
  79. if (key.toString().indexOf(userName) != -1) {
  80. Session session = sessionPool.get(key);
  81. if (session != null && session.isOpen()) {
  82. try {
  83. session.getAsyncRemote().sendObject(message);
  84. } catch (Exception e) {
  85. e.printStackTrace();
  86. }
  87. }
  88. }
  89. }
  90. }
  91. }

发送信息


  
  1. @RestController
  2. @RequestMapping("websocket")
  3. public class WebSocketController {
  4. @GetMapping("setMessage")
  5. @ApiOperation(value = "发送信息接口", notes = "发送信息接口")
  6. public Result
  7. webSocket(@ApiParam(name = "定时任务日志实体", value = "定时任务日志实体", required = false) @RequestBody MessageVO messageVO) {
  8. Result result = new Result();
  9. String userName = messageVO.getUserName();
  10. String message = messageVO.getMessage();
  11. WebSocket webSocket = new WebSocket();
  12. webSocket.sendTextMessage(userName, message);
  13. return result;
  14. }
  15. }

前段代码


  
  1. import sysConfig from "../config";
  2. import {Notification} from 'element-ui';
  3. import {EVENT_TYPE} from "../const";
  4. export function openSocket(userId) {
  5. let ws = new WebSocket(`${sysConfig.SOCKET_URL}/${userId}`);
  6. // let ws = new WebSocket(`ws://121.40.165.18:8800`);
  7. ws.onopen = function (evt) {
  8. Notification({
  9. title: '欢迎回来!',
  10. message: `${sysConfig.SOCKET_URL}/${userId}`
  11. });
  12. };
  13. ws.onmessage = function (e) {
  14. console.log(typeof e.data);
  15. try{
  16. if(e.data!=undefined || e.data!=null){
  17. let json= JSON.parse(e.data);
  18. Notification({
  19. title: json.messageTitle,
  20. message: json.messageText
  21. });
  22. //通知页面更新
  23. window.postMessage(EVENT_TYPE.updateMessage,'/');
  24. }
  25. }catch(err){
  26. console.log("webSocke异常,异常信息:"+err)
  27. }
  28. //ws.close();
  29. };
  30. ws.onclose = function (evt) {
  31. console.log('Connection closed.');
  32. };
  33. }

文章来源: baocl.blog.csdn.net,作者:小黄鸡1992,版权归原作者所有,如需转载,请联系作者。

原文链接:baocl.blog.csdn.net/article/details/105543004

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。