websocket的重连

牧云@^-^@ 提交于 2020-03-15 09:31:37

在做图片的传输时,会经常的断开和卡顿,下面重连的方法解决了经常断开的问题

 

// 图像预览 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请求,不再重连,创建一个变量,控制是否重连。

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!