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

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

后端代码

首先加入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("【websocket消息】有新的连接,总数为:" + webSockets.size());
          }
          @OnClose
         public void onClose() {
              webSockets.remove(this);
              logger.info("【websocket消息】连接断开,总数为:" + webSockets.size());
          }
          @OnMessage
         public void onMessage(String message) {
              logger.info("【websocket消息】收到客户端消息:" + message);
          }
         /**
       * 功能描述: 此为广播消息
       *
       * @param: [message] (消息)
       * @return: void ()
       */
         public void sendAllMessage(String message) {
             for (WebSocket webSocket : webSockets) {
                  logger.info("【websocket消息】广播消息:" + 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.');
        };
      }
  
 

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

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

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

作者其他文章

评论(0

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

    全部回复

    上滑加载中

    设置昵称

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

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

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