123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- /*
- * @Author: your name
- * @Date: 2020-11-13 17:05:22
- * @LastEditTime: 2020-11-13 17:08:35
- * @LastEditors: Please set LastEditors
- * @Description: In User Settings Edit
- * @FilePath: \userCenter\src\utils\websoket.js
- */
- let Socket = ''
- let setIntervalWesocketPush = null
- /**
- * 建立websocket连接
- * @param {string} url ws地址
- */
- export const createSocket = url => {
- Socket && Socket.close()
- if (!Socket) {
-
- Socket = new WebSocket(url)
- console.log('建立websocket连接')
- Socket.onopen = onopenWS
- Socket.onmessage = onmessageWS
- Socket.onerror = onerrorWS
- Socket.onclose = oncloseWS
- } else {
- console.log('websocket已连接')
- }
- }
- /**打开WS之后发送心跳 */
- const onopenWS = () => {
- sendPing()
- }
- /**连接失败重连 */
- const onerrorWS = () => {
- Socket.close()
- clearInterval(setIntervalWesocketPush)
- console.log('连接失败重连中')
- if (Socket.readyState !== 3) {
- Socket = null
- createSocket()
- }
- }
- /**WS数据接收统一处理 */
- const onmessageWS = e => {
- window.dispatchEvent(new CustomEvent('onmessageWS', {
- detail: {
- data: e.data
- }
- }))
- }
- /**
- * 发送数据但连接未建立时进行处理等待重发
- * @param {any} message 需要发送的数据
- */
- const connecting = message => {
- setTimeout(() => {
- if (Socket.readyState === 0) {
- connecting(message)
- } else {
- Socket.send(JSON.stringify(message))
- }
- }, 1000)
- }
- /**
- * 发送数据
- * @param {any} message 需要发送的数据
- */
- export const sendWSPush = message => {
- if (Socket !== null && Socket.readyState === 3) {
- Socket.close()
- createSocket()
- } else if (Socket.readyState === 1) {
- Socket.send(JSON.stringify(message))
- } else if (Socket.readyState === 0) {
- connecting(message)
- }
- }
- /**断开重连 */
- const oncloseWS = () => {
- clearInterval(setIntervalWesocketPush)
- console.log('websocket已断开....正在尝试重连')
- if (Socket.readyState !== 2) {
- Socket = null
- createSocket()
- }
- }
- /**发送心跳
- * @param {number} time 心跳间隔毫秒 默认5000
- * @param {string} ping 心跳名称 默认字符串ping
- */
- export const sendPing = (time = 5000, ping = 'ping') => {
- clearInterval(setIntervalWesocketPush)
- Socket.send(ping)
- setIntervalWesocketPush = setInterval(() => {
- Socket.send(ping)
- }, time)
- }
|