国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

websocket前端封裝代碼,心跳機(jī)制斷線重連

這篇具有很好參考價(jià)值的文章主要介紹了websocket前端封裝代碼,心跳機(jī)制斷線重連。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

websocket簡介(可跳過)

websocket是一種全雙工通信長鏈接,大多用來實(shí)現(xiàn)及時(shí)通訊,數(shù)據(jù)實(shí)時(shí)性要求較為高的地方,在websoket未出現(xiàn)的時(shí)候前端使用的setInterval輪訓(xùn)進(jìn)行數(shù)據(jù)更新的,在那些對于數(shù)據(jù)實(shí)時(shí)性要求不高地方我們?nèi)钥梢允褂?輪訓(xùn)。

(1)建立在 TCP 協(xié)議之上,服務(wù)器端的實(shí)現(xiàn)比較容易。

(2)與 HTTP 協(xié)議有著良好的兼容性。默認(rèn)端口也是80和443,并且握手階段采用 HTTP 協(xié)議,因此握手時(shí)不容易屏蔽,能通過各種 HTTP 代理服務(wù)器。

(3)數(shù)據(jù)格式比較輕量,性能開銷小,通信高效。

(4)可以發(fā)送文本,也可以發(fā)送二進(jìn)制數(shù)據(jù)。

(5)沒有同源限制,客戶端可以與任意服務(wù)器通信。

(6)通常的協(xié)議標(biāo)示符號(hào)為http,而websoket是ws(默認(rèn)端口80),加密通信為wss(默認(rèn)端口443)對應(yīng)為https

websocket前端封裝代碼,心跳機(jī)制斷線重連
Http-長短鏈接

HTTP連接分為長連接和短連接,而我們現(xiàn)在常用的都是HTTP1.1,因此我們用的都是長連接。這句話其實(shí)只對了一半,我們現(xiàn)如今的HTTP協(xié)議,大部分都是1.1的,因此我們平時(shí)用的基本上都是長連接。HTTP協(xié)議根本沒有長短連接這一說。HTTP協(xié)議是基于請求/響應(yīng)模式的,因此只要服務(wù)端給了響應(yīng),本次HTTP連接就結(jié)束了,或者更準(zhǔn)確的說,是本次HTTP請求就結(jié)束了,根本沒有長短連接這一說,

TCP-長短鏈接

長連接和短連接,其實(shí)是說的TCP連接。TCP連接是一個(gè)雙向的通道,它是可以保持一段時(shí)間不關(guān)閉的,因此TCP連接才有真正的長連接和短連接。HTTP協(xié)議說到底是應(yīng)用層的協(xié)議,而TCP才是真正的傳輸層協(xié)議,只有負(fù)責(zé)傳輸?shù)倪@一層才需要建立連接。

就像快遞 填的快遞地址單號(hào)是http,而運(yùn)輸工具例如車 對應(yīng)的是tcp

websocket 心跳機(jī)制/斷線重連機(jī)制

當(dāng)雙方通訊都已經(jīng)鏈接,如果沒有外在原因,雙方不斷開鏈接本質(zhì)上鏈接不會(huì)中斷。

但是存在的外在因素會(huì)讓websoket中斷例如:(網(wǎng)絡(luò)斷線,網(wǎng)絡(luò)狀態(tài)不佳,鏈接需要在內(nèi)網(wǎng)而內(nèi)網(wǎng)無法聯(lián)機(jī),鏈接的進(jìn)程被殺死/服務(wù)器長時(shí)間無通訊)

為了保證這個(gè)通信一直保持鮮活 我們需要增加 心跳機(jī)制/斷線重連機(jī)制

websocket前端封裝代碼,心跳機(jī)制斷線重連
心跳機(jī)制

在與服務(wù)器建立起鏈接的時(shí)候(open) 開始心跳

每隔30s(或者指定時(shí)間 這里都暫用30s)向服務(wù)器 send 一條心跳消息 ?等待 服務(wù)器給 答復(fù)

如果在指定30s 前端收到服務(wù)器返回的消息(message), 重置心跳 重新開始計(jì)時(shí)30s 再次心跳。

如果沒有收到消息(可能是網(wǎng)絡(luò)等原因) 服務(wù)器無應(yīng)答 調(diào)用websocke.close() 關(guān)閉這個(gè)長鏈接 再重新發(fā)送新鏈接請求 請求重新連接 服務(wù)器

重連機(jī)制

我們分別在 websokcet 報(bào)錯(cuò)/close/errno/無響應(yīng)(這里心跳直接調(diào)用close,再用close進(jìn)行重新連接)

封裝 具體代碼

調(diào)用方法

import { socketContact } from '@/utils/websocket'
const wss = socketContact('/ws/quality_panel/', 'quality panel data', (data) => {
  tableData.value = data // 可以自定義數(shù)據(jù)處理
})

具體封裝代碼:

const socketContact = function (contactUrl = '', getDataSecret = '', getDataFn = () => {}) {
  const baseUrl = process.env.VUE_APP_API_WEBSOCKET_URL // baseURL
  const callBack = getDataFn // callback返回?cái)?shù)據(jù)函數(shù)
  const url = contactUrl // 后綴url
  // getDataSecret 需要發(fā)送給服務(wù)器的數(shù)據(jù)
  let socket // websocket本體
  let lock = false // 避免重復(fù)連接
  let replyOverTime = null // 服務(wù)器回復(fù)超時(shí)setTimeout
  let hearByteTime = null // 心跳 setTimeout
  try {
    socket = new WebSocket(baseUrl + url)
    socket.addEventListener('open', function (event) {
      socket.send(getDataSecret)
      heatByte() // 開始心跳
      console.log('鏈接成功', contactUrl, getDataSecret)
    })
    socket.addEventListener('message', function (event) {
      resetHardByte() // 重置心跳
      // 這里transporting...' 和'invalid command...'為服務(wù)器心跳回復(fù) 不做數(shù)據(jù)返回處理
      if (event.data === 'transporting...' || event.data === 'invalid command...') return
      // 處理服務(wù)器返回?cái)?shù)據(jù) 這里可自定義
      const str = event.data.replaceAll('None', 'null')
      // eslint-disable-next-line no-eval
      const data = eval('(' + str + ')')
      callBack(data)
    });
    socket.addEventListener('close', function (event) {
      console.log('鏈接關(guān)閉', event.code)
      reconnect(url, getDataSecret, callBack) // 嘗試重新連接
    });
    socket.addEventListener('errno', function (event) {
      console.log('鏈接報(bào)錯(cuò)')
      reconnect(url, getDataSecret, callBack)// 嘗試重新連接
    });
  } catch (e) {
    console.log('catch', e)
    reconnect(url, getDataSecret, callBack) // 嘗試重新連接
  }
  function heatByte (type) {
    hearByteTime && clearInterval(hearByteTime)
    replyOverTime && clearInterval(replyOverTime)
    // 每30s一次心跳
    hearByteTime = setTimeout(() => {
      if (socket.readyState === 1) {
        socket.send('heart byte') // 沒問題進(jìn)行心跳
        console.log('heart byte')
      }
      // 重新鏈接超時(shí) 60s無回復(fù) 關(guān)閉連接 嘗試重新鏈接
      replyOverTime = setTimeout(() => {
        socket.close()
        console.log('網(wǎng)絡(luò)/其他問題 回復(fù)超時(shí)間關(guān)閉')
      }, 60000)
    }, 30000)
  }
  function resetHardByte () {
    // 進(jìn)行下一次心跳
    hearByteTime && clearTimeout(hearByteTime)
    replyOverTime && clearTimeout(replyOverTime)
    heatByte()
  }
  function reconnect (url, getDataSecret, callBack) {
    if (lock) return
    lock = true
    setTimeout(() => {
      lock = false
      socketContact(url, getDataSecret, callBack)
      console.log('正在嘗試重新連接')
    }, 5000)
  }
  return socket
}

export { socketContact }
參考

長鏈接短連接:http://t.csdn.cn/Ne7g3

websokcet 阮一峰:https://www.ruanyifeng.com/blog/2017/05/websocket.html

websokcet:http://t.csdn.cn/j42h5文章來源地址http://www.zghlxwxcb.cn/news/detail-501434.html

到了這里,關(guān)于websocket前端封裝代碼,心跳機(jī)制斷線重連的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Flutter:WebSocket封裝-實(shí)現(xiàn)心跳、重連機(jī)制

    前言Permalink Flutter簡介 Flutter 是 Google推出并開源的移動(dòng)應(yīng)用開發(fā)框架,主打跨平臺(tái)、高保真、高性能。開發(fā)者可以通過 Dart語言開發(fā) App,一套代碼同時(shí)運(yùn)行在 iOS 和 Android平臺(tái)。 Flutter提供了豐富的組件、接口,開發(fā)者可以很快地為 Flutter添加 native擴(kuò)展。同時(shí) Flutter還使用 Nat

    2024年02月10日
    瀏覽(35)
  • C++ Qt TCP的心跳檢測機(jī)制,斷線重連技術(shù),應(yīng)用層代碼重新實(shí)現(xiàn)

    C++ Qt TCP的心跳檢測機(jī)制,斷線重連技術(shù),應(yīng)用層代碼重新實(shí)現(xiàn)

    目錄 前言: 一、Qt直接啟動(dòng)本身的KeepAlive 二、在應(yīng)用層自己實(shí)現(xiàn)一個(gè)心跳檢測 ?三、自定義心跳代碼實(shí)現(xiàn): 完整客戶端服務(wù)端工程下載: 共用的結(jié)構(gòu)體相關(guān)頭文件: ? ? ? ? 客戶端部分核心代碼: ? ? ? ? 服務(wù)端部分核心代碼: 運(yùn)行結(jié)果展示: 前兩篇關(guān)于qt tcp 相關(guān)的,

    2024年02月05日
    瀏覽(23)
  • websocket斷線重連&&心跳檢測

    websocket斷線重連&&心跳檢測

    封裝websocket 實(shí)現(xiàn)斷線重連跟心態(tài)檢測,使用的typeScript去封裝 在nodejs 安裝ws庫 代碼如下(示例): ?服務(wù)端實(shí)現(xiàn)ws 創(chuàng)建一個(gè)server.js 文件 運(yùn)行ws服務(wù) ? node .server.js? 客戶端實(shí)現(xiàn)websocket 創(chuàng)建一個(gè)socket.ts 文件 vue 頁面使用 斷開ws服務(wù) 斷線? 啟動(dòng)服務(wù)后 自動(dòng)重連

    2024年01月19日
    瀏覽(26)
  • Unity-TCP-網(wǎng)絡(luò)聊天功能(四): 消息粘包、心跳機(jī)制保活(心跳包)、斷線重連

    Unity-TCP-網(wǎng)絡(luò)聊天功能(四): 消息粘包、心跳機(jī)制?;?心跳包)、斷線重連

    bug1:下線后,如果發(fā)送多條消息,在客戶端上線時(shí),一瞬間接收到,效果如同粘包,需要拆包。舉例,連續(xù)發(fā)送三條160長度消息,可能實(shí)際顯示2條消息,原因,第三條消息和第二條消息粘包,第二條消息長度變?yōu)?20,但是Receive方法沒有考慮這個(gè)問題,相當(dāng)于這段代碼只運(yùn)行

    2024年02月11日
    瀏覽(20)
  • uniapp websocket 封裝斷線重連

    uniapp websocket 封裝斷線重連

    ?1.新建一個(gè)工具類js文件 2. 把我封裝的代碼復(fù)制進(jìn)去 我是用uniapp 的api封裝的 在外面也可以直接用uniapp的api操作 只有在開始調(diào)用連接需要用封裝的方法調(diào)用 在需要使用封裝的方法的頁面?引入js ?? ?import { ?? ??? ?websocetObj ?? ?} from \\\"@/API/websocket.js\\\" ?完善重連 在app.vue的

    2024年02月11日
    瀏覽(17)
  • uniapp websocket機(jī)制 心跳 重連

    在開發(fā)程序過程中通信功能還是比較常用到的,本文主要介紹的是uniapp中websocket的使用 websocket建立連接后,斷開、心跳機(jī)制重新鏈接的一個(gè)過程。 關(guān)于uni.connectSocket可仔細(xì)閱讀uniapp官網(wǎng)中的uni.connetSocket以及連接socket創(chuàng)建的實(shí)例 SocketTask ? 具體代碼如下:內(nèi)有代碼詳細(xì)注解,

    2024年02月12日
    瀏覽(27)
  • java實(shí)現(xiàn)WebSocket客戶端&&斷線重連機(jī)制

    1、引入maven依賴(注意版本) 2、代碼

    2024年02月16日
    瀏覽(25)
  • WebSocket心跳檢測和重連機(jī)制

    心跳和重連的目的用一句話概括就是客戶端和服務(wù)端保證彼此還活著,避免丟包發(fā)生。 websocket 連接斷開有以下兩證情況: 前端斷開 在使用 websocket 過程中,可能會(huì)出現(xiàn)網(wǎng)絡(luò)斷開的情況,比如信號(hào)不好,或者網(wǎng)絡(luò)臨時(shí)關(guān)閉,這時(shí)候websocket的連接已經(jīng)斷開,而不同瀏覽器有不同

    2024年01月21日
    瀏覽(33)
  • ai問答:vue3+pinia+WebSocket 封裝斷線重連(實(shí)戰(zhàn))

    把 Socket 實(shí)例 掛載到全局 為方便梳理,請忽略 typescript ,一切盡在注釋中 Socket封裝(斷線重連) 這個(gè) WebSocket 類封裝了 WebSocket 的連接、重連、發(fā)送數(shù)據(jù)等方法。 在 connect 方法中,它會(huì)連接 WebSocket ,并綁定相關(guān)事件監(jiān)聽。 在 onclose 事件中,它會(huì)調(diào)用 reconnect 方法進(jìn)行重連。 recon

    2024年02月03日
    瀏覽(23)
  • WebSocket實(shí)戰(zhàn)之六心跳重連機(jī)制

    WebSocket實(shí)戰(zhàn)之六心跳重連機(jī)制

    WebSocket應(yīng)用部署到生產(chǎn)環(huán)境,我們除了會(huì)碰到因?yàn)榻?jīng)過代理服務(wù)器無法連接的問題(注:該問題可以通過搭建WSS來解決,具體配置請看?WebSocket實(shí)戰(zhàn)之四WSS配置?),另外一個(gè)問題就是外網(wǎng)環(huán)境不穩(wěn)定經(jīng)常會(huì)斷開或者服務(wù)器重啟或者網(wǎng)絡(luò)中間服務(wù)器當(dāng)發(fā)現(xiàn)一個(gè)長連接長時(shí)間沒有

    2024年02月07日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包