最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 前端webSocket实现聊天消息&心跳检测&断线重连

    正文概述 掘金(掺乎君)   2021-01-05   979

    封装socket.js

    class Socket {
        /**
         * @description: 初始化实例属性,保存参数
         * 
         */
        constructor(options) {
            this.url = options.url;
            this.callback = options.received;
            this.name = options.name || 'default';
            this.ws = null;
            this.status = null;
            this.pingInterval = null;
            // 心跳检测频率
            this._timeout = 3000;
            this.isHeart = options.isHeart;
            this.isReconnection = options.isReconnection;
        }
        connect(data) {
            this.ws = new WebSocket(this.url);
            // 建立连接
            this.ws.onopen = (e) => {
                this.status = 'open';
                console.log("连接成功",e)
                if(this.isHeart) {
                    // 心跳
                    this._heartCheck()
                }
                // 给后台发送数据
                if(data !== undefined) {
                    return this.ws.send(JSON.stringify({type: 'init'}))
                }
            }
            // 接受服务器返回的信息
            this.ws.onmessage = (e) => {
                if(typeof this.callback === 'function'){
                    return this.callback(e.data)
                }else{
                    console.log('参数的类型必须为函数')
                }
            }
            // 关闭连接
            this.ws.onclose = (e) => {
                console.log('onclose',e)
                this._closeSocket(e)
            }
            // 报错
            this.onerror = (e) => {
                console.log('onerror',e)
                this._closeSocket(e)
            }
        }
        sendMsg(data) {
            let msg = JSON.stringify(data)
            return this.ws.send(msg)
        }
        _resetHeart() {
            clearInterval(this.pingInterval)
            return this
        }
        _heartCheck() {
            this.pingInterval = setInterval(() => {
                if(this.ws.readyState === 1) {
                    this.ws.send(JSON.stringify({type: 'ping'}))
                }
            },this._timeout)
        }
        _closeSocket(e) {
            this._resetHeart()
            if(this.status !== 'close') {
                console.log('断开,重连',e)
                if(this.isReconnection){
                    // 重连
                    this.connect()
                }
            }else{
                // 手动关闭了
                console.log('手动关闭',e)
            }
        }
        close() {
            this.status = 'close'
            this._resetHeart()
            return this.ws.close();
        }
    }
    
    

    使用

    // 引入文件
    <script src="./socket.js"></script>
    
    <script>
        const ws = new Socket({
            url: 'ws://',// 地址
            name: '',// name
            isHeart:true,// 是否心跳
            isReconnection:false,//是否断开重连
            received: function(data){
            	// 监听服务器返回信息
                console.log("received",data)
            }
        });
        // 建立连接
        let data = {
            type: 'init'
        }
        ws.connect(data);
        
        // 发送消息
        let sendData = {
           type: 'sendMsg'
        }
        ws.sendMsg(sendData)
        
        // 手动关闭
        ws.close()
    </script>
    

    起源地下载网 » 前端webSocket实现聊天消息&心跳检测&断线重连

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元