js实现websocket

import {UserManager} from "@/utils/userManager.js"; class webSocketClass { constructor(url="ws://127.0.0.1:8088/",time=3) { this.url = url this.filterMessagesList = [""]; //服务端返回的内容 message事件不监听的内容,不会再message返回 this.data = null this.heartbeatCheckData = {} //心跳发送的内容 this.isCreate = false // WebSocket 是否创建成功 this.isConnect = false // 是否已经连接 this.isInitiative = false // 是否主动断开 this.timeoutNumber = time // 心跳检测间隔 this.heartbeatTimer = null // 心跳检测定时器 this.reconnectTimer = null // 断线重连定时器 this.socketExamples = null // websocket实例 this.againTime = 3 // 重连等待时间(单位秒) } // 初始化websocket连接 initSocket(gameId) { const _this = this this.socketExamples = uni.connectSocket({ url: `${_this.url}?gameId=${gameId}&$userId=${UserManager.shared().userInfo.userId}`, header: { 'content-type': 'application/json', token: UserManager.shared().userInfo ? UserManager.shared().userInfo.token : '' }, success: (res) => { _this.isCreate = true console.log(res) }, fail: (rej) => { console.error(rej) _this.isCreate = false } }) this.createSocket() } // 创建websocket连接 createSocket() { var _this = this if (this.isCreate) { console.log('WebSocket 开始初始化') // 监听 WebSocket 连接打开事件 try { this.socketExamples.onOpen(() => { console.log('WebSocket 连接成功') this.isConnect = true clearInterval(this.heartbeatTimer) clearTimeout(this.reconnectTimer) // 打开心跳检测 this.heartbeatCheck() }) // 监听 WebSocket 接受到服务器的消息事件 this.socketExamples.onMessage((res) => { console.log('收到消息---',res.data) if (_this.filterMessagesList.includes(res.data)) { console.log(`信息:${res.data}--在过滤列表中不进行推送`) }else{ uni.$emit('message', res) } }) // 监听 WebSocket 连接关闭事件 this.socketExamples.onClose(() => { console.log('WebSocket 关闭了') this.isConnect = false this.reconnect() }) // 监听 WebSocket 错误事件 this.socketExamples.onError((res) => { console.log('WebSocket 出错了') console.log(res) this.isInitiative = false }) } catch (error) { console.warn(error) } } else { console.warn('WebSocket 初始化失败!') } } //判断是否为{} isEmptyObject(value) { return typeof value === 'object' && Object.keys(value).length === 0; } // 发送消息 sendMsg(value) { if (!this.isEmptyObject(value)){ value["userId"] = UserManager.shared().userInfo ? UserManager.shared().userInfo.userId : '' } const param = JSON.stringify(value) return new Promise((resolve, reject) => { this.socketExamples.send({ data: param, success() { console.log('消息发送成功') resolve(true) }, fail(error) { console.log('消息发送失败') reject(error) } }) }) } // 开启心跳检测 heartbeatCheck() { var _this = this console.log('开启心跳') this.heartbeatTimer = setInterval(() => { _this.sendMsg(_this.heartbeatCheckData) }, _this.timeoutNumber * 1000) } // 重新连接 reconnect() { // 停止发送心跳 clearTimeout(this.reconnectTimer) clearInterval(this.heartbeatTimer) // 如果不是人为关闭的话,进行重连 if (!this.isInitiative) { this.reconnectTimer = setTimeout(() => { this.initSocket() }, this.againTime * 1000) } } // 关闭 WebSocket 连接 closeSocket(reason = '关闭') { const _this = this this.socketExamples.close({ reason, success() { _this.data = null _this.isCreate = false _this.isConnect = false _this.isInitiative = true _this.socketExamples = null clearInterval(_this.heartbeatTimer) clearTimeout(_this.reconnectTimer) console.log('关闭 WebSocket 成功') }, fail(error) { console.log('关闭 WebSocket 失败',error) } }) } } export {webSocketClass}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章