Websocket封装及使用
1.封装 webSocket.js
1 // websocket实例 2 let wsObj = null 3 4 // ws连接地址 5 let wsUrl = null 6 7 // 是否执行重连 true/不执行 ; false/执行 8 let lockReconnect = false 9 10 // 重连定时器 11 let wsCreateHandler = null 12 13 // 连接成功,执行回调函数 14 let messageCallback = null 15 16 // 连接失败,执行回调函数 17 let errorCallback = null 18 19 // 发送给后台的数据 20 let sendDatas = {} 21 22 /** 23 * 发起websocket请求函数 24 * @param {string} url ws连接地址 25 * @param {Object} agentData 传给后台的参数 26 * @param {function} successCallback 接收到ws数据,对数据进行处理的回调函数 27 * @param {function} errCallback ws连接错误的回调函数 28 */ 29 export const connectWebsocket = (url, agentData, successCallback, errCallback) => { 30 wsUrl = url 31 createWebSoket() 32 messageCallback = successCallback 33 errorCallback = errCallback 34 sendDatas = agentData 35 } 36 37 // 创建ws函数 38 const createWebSoket = () => { 39 if (typeof (WebSocket) === 'undefined') { 40 writeToScreen('您的浏览器不支持WebSocket,无法获取数据') 41 return false 42 } 43 44 try { 45 wsObj = new WebSocket(wsUrl) 46 initWsEventHandle() 47 } catch (e) { 48 writeToScreen('连接异常,开始重连') 49 reconnect() 50 } 51 } 52 53 // 手动关闭websocket (这里手动关闭会执行onclose事件) 54 export const closeWebsocket = () => { 55 if (wsObj) { 56 writeToScreen('手动关闭websocket') 57 wsObj.close() // 关闭websocket 58 // wsObj.onclose() // 关闭websocket(如果上面的关闭不生效就加上这一条) 59 // 关闭重连 60 lockReconnect = true 61 wsCreateHandler && clearTimeout(wsCreateHandler) 62 // 关闭心跳检查 63 heartCheck.stop() 64 } 65 } 66 67 68 // 创建成功后的处理 69 const initWsEventHandle = () => { 70 try { 71 // 连接成功后的回调函数 72 wsObj.binaryType = "arraybuffer";//返回 websocket 连接所传输二进制数据的类型。 73 wsObj.onopen = (event) => { 74 onWsOpen(event) 75 // heartCheck.start() 76 } 77 // 监听服务器端返回的信息 78 wsObj.onmessage = (event) => { 79 onWsMessage(event) 80 // heartCheck.start() 81 } 82 // 连接关闭后的回调函数 83 wsObj.onclose = (event) => { 84 writeToScreen('onclose执行关闭事件') 85 onWsClose(event) 86 } 87 // 报错时的回调函数 88 wsObj.onerror = (event) => { 89 writeToScreen('onerror执行error事件,开始重连') 90 onWsError(event) 91 reconnect() 92 } 93 } catch (err) { 94 writeToScreen('绑定事件没有成功,开始重连') 95 reconnect() 96 } 97 } 98 99 // 连接成功后发送数据的处理函数 100 const onWsOpen = (event) => { 101 writeToScreen('CONNECT') 102 // // 客户端与服务器端通信 103 // wsObj.send('我发送消息给服务端'); 104 // 添加状态判断,当为OPEN时,发送消息 105 if (wsObj.readyState === wsObj.OPEN) { // wsObj.OPEN = 1 106 // 发给后端的数据需要字符串化 107 console.log('发送标识', sendDatas) 108 wsObj.send(sendDatas) 109 } 110 if (wsObj.readyState === wsObj.CLOSED) { // wsObj.CLOSED = 3 111 writeToScreen('wsObj.readyState=3, ws连接异常,开始重连') 112 reconnect() 113 errorCallback() 114 } 115 } 116 117 // 收到服务器数据后的回调函数 118 const onWsMessage = (event) => { 119 const jsonStr = event.data 120 // var buffer = new Uint8Array(jsonStr, 0, jsonStr.length); 121 // let message = PuppyWebSocketMessage.decode(buffer); 122 123 writeToScreen('onWsMessage接收到服务器的数据: ', jsonStr) 124 125 messageCallback(message) 126 } 127 128 // 连接关闭后的回调函数 129 const onWsClose = (event) => { 130 writeToScreen('DISCONNECT') 131 // e.code === 1000 表示正常关闭。 无论为何目的而创建, 该链接都已成功完成任务。 132 // e.code !== 1000 表示非正常关闭。 133 console.log('onclose event: ', event) 134 if (event && event.code !== 1000) { 135 writeToScreen('非正常关闭') 136 errorCallback() 137 // 如果不是手动关闭,这里的重连会执行;如果调用了手动关闭函数,这里重连不会执行 138 reconnect() 139 } 140 } 141 142 // 连接失败 后的错误返回 143 const onWsError = (event) => { 144 writeToScreen('onWsError: ', event.data) 145 errorCallback() 146 } 147 148 //打印连接信息 149 const writeToScreen = (massage) => { 150 console.log(massage) 151 } 152 153 // 重连函数 154 const reconnect = () => { 155 if (lockReconnect) { 156 return 157 } 158 writeToScreen('3秒后重连') 159 lockReconnect = true 160 // 没连接上会一直重连,设置延迟避免请求过多 161 wsCreateHandler && clearTimeout(wsCreateHandler) 162 wsCreateHandler = setTimeout(() => { 163 writeToScreen('重连...' + wsUrl) 164 createWebSoket() 165 lockReconnect = false 166 writeToScreen('重连完成') 167 }, 3000) 168 } 169 170 // 心跳检查(看看websocket是否还在正常连接中) 171 const heartCheck = { 172 timeout: 60000, 173 timeoutObj: null, 174 serverTimeoutObj: null, 175 // 重启 176 reset() { 177 clearTimeout(this.timeoutObj) 178 clearTimeout(this.serverTimeoutObj) 179 this.start() 180 }, 181 // 停止 182 stop() { 183 clearTimeout(this.timeoutObj) 184 clearTimeout(this.serverTimeoutObj) 185 }, 186 // 开启定时器 187 start() { 188 this.timeoutObj && clearTimeout(this.timeoutObj) 189 this.serverTimeoutObj && clearTimeout(this.serverTimeoutObj) 190 // 15s之内如果没有收到后台的消息,则认为是连接断开了,需要重连 191 this.timeoutObj = setTimeout(() => { 192 writeToScreen('心跳检查,发送ping到后台') 193 try { 194 const datas = { ping: true } 195 wsObj.send(JSON.stringify(datas)) 196 } catch (err) { 197 writeToScreen('发送ping异常') 198 } 199 console.log('内嵌定时器this.serverTimeoutObj: ', this.serverTimeoutObj) 200 // 内嵌定时器 201 this.serverTimeoutObj = setTimeout(() => { 202 writeToScreen('没有收到后台的数据,重新连接') 203 reconnect() 204 }, 100) 205 }, this.timeout) 206 } 207 }
2.使用
1 import { connectWebsocket } from "../api/websocket"; 2 3 4 created(){ 5 connectWebsocket( 6 URL, 7 // 发送 8 "HeartBeat", 9 // 成功拿到后台返回的数据的回调函数 10 (data) => { 11 console.log("成功的回调函数, 接收到的data数据: ", data); 12 this.Socket(data); 13 }, 14 // websocket连接失败的回调函数 15 () => { 16 console.log("失败的回调函数"); 17 } 18 ); 19 }, 20 21 methods:{ 22 Socket(e) { 23 console.log(e); 24 } 25 }
转载:https://blog.csdn.net/m0_49256439/article/details/126133435