zoukankan      html  css  js  c++  java
  • webSocket实现后台给前台通知

      <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-websocket</artifactId>
      </dependency>

    webSocket的配置类

    package com.example.config;
    
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.socket.server.standard.ServerEndpointExporter;
    import org.springframework.web.socket.config.annotation.EnableWebSocket;
    
    /**
     * @ClassName: WebSocketConfig
     * @Auther: zhaoxiuhao
     * @Date: 2020/12/5 17:33
     * @Description: TODO
     * @Version: 1.0
     */
    @Configuration
    @EnableWebSocket
    public class WebSocketConfig {
        @Bean
        public ServerEndpointExporter serverEndpoint() {
    
            return new ServerEndpointExporter();
        }
    }

    websocket的连接监听

    package com.example.websocket;
    
    import com.alibaba.fastjson.JSONObject;
    import org.springframework.context.annotation.Bean;
    import org.springframework.stereotype.Component;
    import org.springframework.web.socket.server.standard.ServerEndpointExporter;
    
    
    import javax.websocket.*;
    import javax.websocket.server.PathParam;
    import javax.websocket.server.ServerEndpoint;
    import java.io.IOException;
    import java.util.Map;
    import java.util.concurrent.ConcurrentHashMap;
    
    /**
     *
     */
    @ServerEndpoint("/webSocket/{username}")
    @Component
    public class WebSocket {
        private static int onlineCount = 0;
        private static Map<String, WebSocket> clients = new ConcurrentHashMap<String, WebSocket>();
        private Session session;
        private String username;
    
        public WebSocket() {
            System.out.println(1111);
        }
        /**
         * 建立连接的时候
         **/
        @OnOpen
        public void onOpen(@PathParam("username") String username, Session session) throws IOException {
    
            this.username = username;
            this.session = session;
    
            addOnlineCount();
            clients.put(username, this);
            System.out.println("已连接");
        }
    
        @OnClose
        public void onClose() throws IOException {
            clients.remove(username);
            subOnlineCount();
        }
    
        @OnMessage
        public void onMessage(String message) throws IOException {
            JSONObject jsonObject = JSONObject.parseObject(message);
            String mes= jsonObject.getString("message");
            if (!jsonObject.getString("To").equals("All")) {
                sendMessageTo(mes, jsonObject.getString("To"));
            } else {
                sendMessageAll("给所有人");
            }
    
        }
    
        @OnError
        public void onError(Session session, Throwable error) {
            error.printStackTrace();
        }
      //给某个人发送信息
        public void sendMessageTo(String message, String To) throws IOException {
            for (WebSocket item : clients.values()) {
                if (item.username.equals(To) )
                    item.session.getAsyncRemote().sendText(message);
            }
        }
      //给所有人发送信息
        public void sendMessageAll(String message) throws IOException {
            for (WebSocket item : clients.values()) {
                item.session.getAsyncRemote().sendText(message);
            }
        }
    
        public static synchronized int getOnlineCount() {
            return onlineCount;
        }
    
        public static synchronized void addOnlineCount() {
            WebSocket.onlineCount++;
        }
    
        public static synchronized void subOnlineCount() {
            WebSocket.onlineCount--;
        }
    
        public static synchronized Map<String, WebSocket> getClients() {
            return clients;
        }
    
        public Session getSession() {
            return session;
        }
    }

    主动调用后台的方法推送信息

    package com.example.websocket;
    
    import com.example.websocket.WebSocket;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    
    import java.io.IOException;
    import java.util.Map;
    
    /**
     * @ClassName: WebSocketController
     * @Auther: zhaoxiuhao
     * @Date: 2020/12/5 16:20
     * @Description: TODO
     * @Version: 1.0
     */
    @RestController
    @RequestMapping("/socket")
    public class WebSocketController {
        @Autowired
        private WebSocket webSocket;
        @RequestMapping("/sendMessage")
        public void sendMessage(@RequestParam("message")String message) throws IOException {
            webSocket.sendMessageAll(message);
    
        }
        
    }

     前端建立websocket连接

     mounted() {
          var host = document.location.host;
          const url = 'ws://192.168.0.102:8081/'  + 'webSocket/' + "user";
            var websocket = null
         // alert(url)
         if ('WebSocket' in window) {
              websocket = new WebSocket(url);
               //alert("支持WebSocket协议");
          } else {
              alert("不支持WebSocket协议");
          }
        
          //WebSocket连接发生错误的回调方法
        websocket.onerror = function () {
            console.log("连接失败")
        };
    
        //WebSocket连接成功建立的回调方法
        websocket.onopen = function () {
            console.log("WebSocket连接成功");
        };
    
        //接收到消息的回调方法
        websocket.onmessage = (event)=> {
            console.log("接收到推送过来的信息",event.data)
              this.$notify({
                showClose: true,
                message: '单击'+JSON.stringify(event.data),
                type: 'success',
              });
            // websocket.close();
            // alert("webSocket已关闭!")
        };
    
        //监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
        window.onbeforeunload = function () {
            //closeWebSocket();
        };
    
        //关闭WebSocket连接
        function closeWebSocket() {
            websocket.close();
        }
    
        //连接关闭的回调方法
        websocket.onclose = function () {
             console.log("WebSocket连接关闭");
        };
  • 相关阅读:
    Codeforces Round #592 (Div. 2)C. The Football Season(暴力,循环节)
    Educational Codeforces Round 72 (Rated for Div. 2)D. Coloring Edges(想法)
    扩展KMP
    poj 1699 Best Sequence(dfs)
    KMP(思路分析)
    poj 1950 Dessert(dfs)
    poj 3278 Catch That Cow(BFS)
    素数环(回溯)
    sort与qsort
    poj 1952 buy low buy lower(DP)
  • 原文地址:https://www.cnblogs.com/dkws/p/14090657.html
Copyright © 2011-2022 走看看