vue項目封裝webSocket(實現前端即時通訊)


let Socket = ''
let setIntervalWesocketPush = null

/**

  • 建立websocket連接
  • @param {string} url ws地址
    */
    export const createSocket = url => {
    Socket && Socket.close()
    if (!Socket) {
    console.log('建立websocket連接')
    Socket = new WebSocket(url)
    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)
    }

項目中的使用場景
1.(websocket在本地沒有問題,但是到服務器就出現問題,所以需要在打包后控制websocket的開關)
答:使用了webpack generate-asset-plugin插件

2.怎么能保證每一次返回的數據能對應到就是我需要的數據呢(工作流)?
答: 把之前的websocket關閉掉,然后重新打開websocket

3.怎么拿取返回的數據呢?什么時候拿數據呢
答:需要監聽(addEventListener)websocket中的onmessage,這樣就在后端返回數據的時候就能拿取到

參考文獻:https://www.cnblogs.com/wurijie/p/11904060.html
https://www.shuzhiduo.com/A/l1dyogZxJe/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM