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

posted @ 2023-02-24 15:18  虚无——缥缈  阅读(300)  评论(0编辑  收藏  举报