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>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM