1、为什么用Websocket?

解决服务端被动给客户端推送数据;失常ajax,axios只能通过客户端被动调用;能力实现服务端到客户端的数据传送

教程:http://www.ruanyifeng.com/blo...

2、内容

(1) wsUrl + wsConfig //链接地址 + Websocket配置(2) createWebSocket //建设Websocket(3) initEventHandle //初始化实现(4) reconnect //重连

3、wsUrl + wsConfig

const wsUrl = "ws://192.168.0.79:8087/home/"var heartCheck = {        timeout: 3000, //每三秒心跳一次        timeoutObj: null,        serverTimeoutObj: null,        reset: function() {            clearTimeout(this.timeoutObj);            clearTimeout(this.serverTimeoutObj);            return this;        },        start: function(type = 1) {            const self = this;            self.timeoutObj = setTimeout(function() {                //这里发送一个心跳,后端收到后,返回一个心跳音讯, onmessage拿到返回的心跳就阐明连贯失常                ws.readyState == 1 && ws.send("-1");                self.serverTimeoutObj = setTimeout(function() { //如果超过肯定工夫还没重置,阐明后端被动断开了                    //如果onclose会执行reconnect,进行重连                    //如果间接执行reconnect 会触发onclose导致重连两次                    ws.close();                 }, type != 1 ? 1000 : 10000)            }, type != 1 ? 1000 : self.timeout)        }    }

4、建设Websocket链接 createWebSocket

function createWebSocket(url){         try {             if ('WebSocket' in window) {                ws = new WebSocket(url + apiId);             } else {                // 不反对WebSocket             }             initEventHandle();//初始化         } catch (e) {             reconnect(wsUrl);//重连         }    }

5、初始化 initEventHandle

function initEventHandle(type) {        // 连贯胜利建设后响应        ws.onopen = function() {            document.getElementById("zhuangtai").innerHTML = "已连贯"            heartCheck.reset().start();//心跳检测重置        }        // 收到服务器音讯后响应        ws.onmessage = function(event) {            let datas = JSON.parse(event.data)            //如果获取到音讯,心跳检测重置;拿到任何音讯都阐明以后连贯是失常的            heartCheck.reset().start();            if(datas != -1) handleSendEvent(datas)        }        // 失常断开        ws.onclose = function() {            heartCheck.reset()            document.getElementById("zhuangtai").innerHTML = "已断开"            reconnect(wsUrl); //重连        }        // 异样谬误断开        ws.onerror = function() {            heartCheck.reset()            document.getElementById("zhuangtai").innerHTML = "已断开"            reconnect(wsUrl); //重连        };        if(document.getElementById("zhuangtai").innerHTML == "已断开"){            heartCheck.reset().start(0);        }    }

6、重连 reconnect

function reconnect(url) {        if(lockReconnect) return;        api.showProgress({            title: '提醒',            text: '通信正在连接...',            modal: true        });        lockReconnect = true;        //没连贯上会始终重连,设置提早防止申请过多        clearTimeout(chongTimeout);        chongTimeout = setTimeout(function () {            createWebSocket(wsUrl);            // console.log("正在重连,以后工夫"+new Date())            api.hideProgress();            lockReconnect = false;        }, 0); //这里设置重连距离(ms)    }