当前位置:   article > 正文

2023 Java springboot配置webSocket,监测前端调用操作的接口并给予推送消息实现数据刷新!三步从入门到调用成功_websocketserver controller调用

websocketserver controller调用

一、 pom依赖

springboot版本

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

二、3个工具类拿来就用

 ①WebSocketConfig

  1. import org.springframework.context.annotation.Bean;
  2. import org.springframework.context.annotation.Configuration;
  3. import org.springframework.web.socket.server.standard.ServerEndpointExporter;
  4. /**
  5. * WebSocket配置类。开启WebSocket的支持
  6. */
  7. @Configuration
  8. public class WebSocketConfig {
  9. @Bean
  10. public ServerEndpointExporter serverEndpointExporter() {
  11. return new ServerEndpointExporter();
  12. }
  13. }

 ②WebsocketService

  1. import com.alibaba.fastjson.JSONObject;
  2. import com.xiaoqiu.juyilargescreen.utils.WebsocketServiceResp;
  3. import lombok.extern.slf4j.Slf4j;
  4. import org.springframework.stereotype.Component;
  5. import javax.websocket.*;
  6. import javax.websocket.server.PathParam;
  7. import javax.websocket.server.ServerEndpoint;
  8. import java.io.IOException;
  9. import java.util.*;
  10. import java.util.concurrent.ConcurrentHashMap;
  11. /**
  12. * @ServerEndpoint 注解是一个类层次的注解,它的功能主要是将目前的类定义成一个websocket服务器端,
  13. * 注解的值将被用于监听用户连接的终端访问URL地址,客户端可以通过这个URL来连接到WebSocket服务器端
  14. */
  15. @ServerEndpoint("/notice/{userId}")
  16. @Component
  17. @Slf4j
  18. public class WebsocketService {
  19. //记录连接的客户端
  20. public static Map<String, Session> clients = new ConcurrentHashMap<>();
  21. /**
  22. * userId关联sid(解决同一用户id,在多个web端连接的问题)
  23. */
  24. public static Map<String, Set<String>> conns = new ConcurrentHashMap<>();
  25. private String sid = null;
  26. private String userId;
  27. private static Map map = new HashMap();
  28. /**
  29. * 连接成功后调用的方法
  30. * @param session
  31. * @param userId
  32. */
  33. @OnOpen
  34. public void onOpen(Session session, @PathParam("userId") String userId) {
  35. this.sid = UUID.randomUUID().toString();
  36. this.userId = userId;
  37. clients.put(this.sid, session);
  38. Set<String> clientSet = conns.get(userId);
  39. if (clientSet==null){
  40. clientSet = new HashSet<>();
  41. conns.put(userId,clientSet);
  42. }
  43. clientSet.add(this.sid);
  44. log.info(this.sid + "连接开启!");
  45. }
  46. /**
  47. * 连接关闭调用的方法
  48. */
  49. @OnClose
  50. public void onClose() {
  51. log.info(this.sid + "连接断开!");
  52. clients.remove(this.sid);
  53. }
  54. /**
  55. * 判断是否连接的方法
  56. * @return
  57. */
  58. public static boolean isServerClose() {
  59. if (WebsocketService.clients.values().size() == 0) {
  60. log.info("已断开");
  61. return true;
  62. }else {
  63. log.info("已连接");
  64. return false;
  65. }
  66. }
  67. /**
  68. * 发送给所有用户
  69. * @param noticeType
  70. */
  71. public static void sendMessage(String noticeType){
  72. WebsocketServiceResp WebsocketServiceResp = new WebsocketServiceResp();
  73. WebsocketServiceResp.setNoticeType(noticeType);
  74. sendMessage(WebsocketServiceResp);
  75. }
  76. /**
  77. * 发送给所有用户
  78. * @param WebsocketServiceResp
  79. */
  80. public static void sendMessage(WebsocketServiceResp WebsocketServiceResp){
  81. String message = JSONObject.toJSONString(WebsocketServiceResp);
  82. for (Session session1 : WebsocketService.clients.values()) {
  83. try {
  84. session1.getBasicRemote().sendText(message);
  85. } catch (IOException e) {
  86. e.printStackTrace();
  87. }
  88. }
  89. }
  90. /**
  91. * 收到客户端消息后调用的方法
  92. * @param message
  93. * @param session
  94. */
  95. @OnMessage
  96. public void onMessage(String message, Session session) {
  97. log.info("收到来自窗口"+this.userId+"的信息:"+message);
  98. }
  99. /**
  100. * 发生错误时的回调函数
  101. * @param error
  102. */
  103. @OnError
  104. public void onError(Throwable error) {
  105. log.info("错误");
  106. error.printStackTrace();
  107. }
  108. }

③WebsocketServiceResp

  1. import io.swagger.annotations.ApiModel;
  2. import io.swagger.annotations.ApiModelProperty;
  3. import lombok.Data;
  4. @Data
  5. @ApiModel("ws通知返回对象")
  6. public class WebsocketServiceResp<T> {
  7. @ApiModelProperty(value = "通知类型")
  8. private String noticeType;
  9. @ApiModelProperty(value = "通知内容")
  10. private T noticeInfo;
  11. }

三、controller监测接口是否被调用,并给前端推送消息

  1. @ApiOperation("修改名称的接口")
  2. @GetMapping("/edit")
  3. //必须加,否则容易报错
  4. @ResponseBody
  5. public boolean edit(Integer id, String name) {
  6. //通知前端修改了数据(前端收到结果,会重新调用获取数据列表的接口)
  7. WebsocketService.sendMessage("调用了修改名称");
  8. //修改的操作(这里是简单示例,看个人需求)
  9. Goods goods = goodsService.getById(id);
  10. goods.setGoodName(name);
  11. //返回修改结果 truefalse
  12. return goodsService.updateById(goods);
  13. }

四、最终效果

启动后

 

前端收到推送消息,重新获取数据列表接口(前端操作,这里不多写)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/150889
推荐阅读
相关标签
  

闽ICP备14008679号