websocket的封装写法

忘了是哪里抄的,感谢那位仁兄。

代码其他不需要改 ,,,只要改wsUrl变量,代码逻辑在doWithMsg函数中,因为还有心跳检测,会向后端发送心跳数据,需要返回数据,这个要后端配合下

<script>
    var ws;//websocket实例
    var lockReconnect = false;//避免重复连接
    var wsUrl = "xxx";
 
    function createWebSocket(url) {
        try {
            if ('WebSocket' in window) {
                ws = new WebSocket(url);
                initEventHandle();
            }else{
                console.log('您的浏览器不支持websocket')
            }
        } catch (e) {
            reconnect(url);
        }
    }
    function initEventHandle() {
        ws.onclose = function (evnt) {
            //console.log('websocket服务关闭了');
            reconnect(wsUrl);
        };
        ws.onerror = function (evnt) {
            //console.log('websocket服务出错了');
            reconnect(wsUrl);
        };
        ws.onopen = function (evnt) {
            //心跳检测重置
            heartCheck.reset().start();
        };
        ws.onmessage = function (evnt) {
            //如果获取到消息,心跳检测重置
            //拿到任何消息都说明当前连接是正常的
            //console.log('websocket服务获得数据了');
 
            //接受消息后的UI变化
            doWithMsg(evnt.data);
            heartCheck.reset().start();
        }
        //收到消息推送
        function doWithMsg(msg) {
            // json数据转换成js对象
            var data = eval("(" + msg + ")");
            var type = data.type || '';
            switch (type) {
                // 返回的init类型的消息,将client_id发给后台进行uid绑定
                case 'init':
                    // 利用jquery发起ajax请求,将client_id发给后端进行uid绑定
                    // $.post('./bind.php', {client_id: data.client_id}, function(data){}, 'json');
                    break;
                case 'content':
                    var value = array[Math.round(Math.random()*(array.length-1))];
                    // var data = JSON.parse(JSON.stringify(data.data))
                    break;
                default:
                    console.log(data);
            }
        }
    }
    function reconnect(url) {
        if(lockReconnect) return;
        lockReconnect = true;
        //没连接上会一直重连,设置延迟避免请求过多
        setTimeout(function () {
            createWebSocket(url);
            lockReconnect = false;
        }, 5000);
    }
    //心跳检测
    var heartCheck = {
        timeout: 60000,//60秒
        timeoutObj: null,
        serverTimeoutObj: null,
        reset: function(){
            clearTimeout(this.timeoutObj);
            clearTimeout(this.serverTimeoutObj);
            return this;
        },
        start: function(){
            var self = this;
            this.timeoutObj = setTimeout(function(){
                //这里发送一个心跳,后端收到后,返回一个心跳消息,
                //onmessage拿到返回的心跳就说明连接正常
                ws.send("HeartBeat");
                self.serverTimeoutObj = setTimeout(function(){//如果超过一定时间还没重置,说明后端主动断开了
                    ws.close();//如果onclose会执行reconnect,我们执行ws.close()就行了.如果直接执行reconnect 会触发onclose导致重连两次
                }, self.timeout)
            }, this.timeout)
        }
    }
    //初始化websocket
    createWebSocket(wsUrl);
</script>

 

posted @ 2021-04-02 12:42  萧声幽篱  阅读(610)  评论(0编辑  收藏  举报