在做图片的传输时,会经常的断开和卡顿,下面重连的方法解决了经常断开的问题
// 图像预览 websocket
var ws;
// 是否有ajax的返回消息时调用, 如果有返回值 -> 值为true, 执行重连, 否则 -> 为 false,就不会执行重连
var flag;
// 图片
var img = "";
function createWebSocket(url) {
flag = true;
try { // 如果websocket不存在的时候 实例化websocket,并且调用websocket的函数
if (ws == null || typeof ws !== WebSocket) {
ws = new WebSocket(url);
initEventHandle();
} else {
reconnect(url);
}
} catch (e) {
$('#image').attr('src', './images/480x270.png');
}
}
// 判断是否有图像传回来
var hasImage = false;
function initEventHandle() {
ws.onclose = function (event) {
if (flag) {
reconnect(wsUrl);
} else { }
};
ws.onerror = function (event) {
if (flag) {
reconnect(wsUrl);
} else { }
};
ws.onopen = function () {
//心跳检测重置
heartCheck.reset().start();
};
ws.onmessage = function (event) {
//如果获取到消息,心跳检测重置
//拿到任何消息都说明当前连接是正常的
var data = JSON.parse(event.data);var serverTimer; // 如果没有image字段,没有图像传回来,开始定时器,这时 hasImage是false,不会进到websocket关闭的函数, 如果没有接到字段,hasImage值为true,一秒钟之后,计时器会进入到onclose事件, 其间如果接收到字段,hasImage值为false,计时器也将不会执行onclose事件
if (!data.image) {
serverTimer = setTimeout(function () { //如果超过一定时间还没重置,说明后端主动断开了
if (hasImage) {
if ( !(ws.readyState == 2 || ws.readyState == 3) ) {
ws.onclose();
ws.close();
}
$('#image').attr('src', './images/480x270.png');
}
}, 1000)
hasImage = true;
} else { // 有image字段传回来,清空定时器,hasImage变量为false
hasImage = false;
clearTimeout(serverTimer);
}
// 有image图像,保存到img变量,如果没有图片传回来,可以显示上一张图片,避免页面出现空白
if (data.image) img = data.image;
if (img == "") $('#image').attr('src', './images/480x270.png');
$('#image').attr('src', 'data:image/png;base64,' + img);
// 将数据置空
data = null;
}
}
function reconnect(url) {
//没连接上会一直重连,设置延迟避免请求过多
var timer = setTimeout(function () {
if (ws.readyState == 2 || ws.readyState == 3) {
ws.onopen();
} else if (ws.readyState == 1) {
clearTimeout(timer);
}
}, 500);
}
//心跳检测
var heartCheck = {
timeout: 1000,//1秒
timeoutObj: null,
serverTimeoutObj: null,
reset: function () {
clearTimeout(this.timeoutObj);
return this;
},
start: function () {
var self = this;
this.timeoutObj = setTimeout(function () {
//这里发送一个心跳,后端收到后,返回一个心跳消息,
//onmessage拿到返回的心跳就说明连接正常
ws.send('{\"token\":\"\", \"code\": \"1\"}');
}, this.timeout)
}
}
一直在传图的时候,普通的websocket写法会经常断开,图片显示不出来,页面不流畅,
先保存websocket传来的base64字段,断开的时候,会显示传来的上一张图片,页面不会出现空白,
在websocket错误或者关闭的时候,再进行重连。
可能会出现一直重连失败的情况,设置重连次数,超过后,页面恢复初始化。
在请求资源得到相应的时候,要关闭websocket请求,不再重连,创建一个变量,控制是否重连。
来源:https://www.cnblogs.com/una1804/p/9116890.html