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)
}
发表回复