最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

在Vue中使用WebScoket?會(huì)怎么樣?

 更新時(shí)間:2022年01月26日 11:08:36   作者:橙序員  
這篇文章主要介紹了在Vue中使用WebScoket,網(wǎng)絡(luò)的不穩(wěn)定而斷開連接,webscoket不會(huì)出現(xiàn)異常,下面就一起進(jìn)入文章看看吧

最近項(xiàng)目中使用到了webscoket,這個(gè)東西吧,用起來也很簡單。

但是我發(fā)現(xiàn),這個(gè)東西會(huì)因?yàn)榫W(wǎng)絡(luò)的不穩(wěn)定而斷開連接,斷開就斷開吧,關(guān)鍵是斷開了,webscoket不會(huì)出現(xiàn)異常。

于是就要自己去檢測,這個(gè)有沒有掉線。

我的想法是,每隔30秒向服務(wù)器發(fā)送信息,

每隔32秒去判斷有沒有收到消息,如果沒有則判斷為斷開連接,進(jìn)行重新連接。

因?yàn)槲业募夹g(shù)能力還不是很強(qiáng),所有代碼在寫法上有些不足,或許有些冗余,

但是功能的實(shí)現(xiàn)是沒有問題的,

話不多說,上代碼:

export default {
? data(){
? ? return {
? ? ? path:'', ? ? ? // WebSocket的地址
? ? ? socket:'', ? ? // WebSocket實(shí)例?
? ? ? times:0, ? ? ? // 短線重新連接次數(shù)
? ? ? isConn:true, ? // 配合次數(shù)進(jìn)行自動(dòng)重連
? ? ? heart:0, ? ? ? // 接收定時(shí)器,用來檢測WebScoket是否斷線
? ? ? Tim:0, ? ? ? ? // 用于判斷是否接收消息的定時(shí)器
? ? }
? },
? mounted(){
? ? this.path = 'ws://82.157.123.54:9010/ajaxchattest'; // 測試地址,百度上可以搜索到
? ? //this.path = 'ws://' + window.location.hostname + '/devices/history'; // 獲取瀏覽器當(dāng)前地址,因?yàn)楹笈_(tái)ip可能不固定,如果固定可以寫死,就像上面那樣,但是如果ip動(dòng)態(tài),則可以使用這個(gè),上線使用
? ? this.Init(this.path); // 掛載時(shí),初始化數(shù)據(jù),建立連接等
? },
? methods: {
? ? Init(path){
? ? ? this.socket = new WebSocket(path); // 進(jìn)行連接,連接的結(jié)果和狀態(tài)在下面的onopen、onmessage、onclose
? ? ? let that = this; // 因?yàn)橄旅媸褂昧似胀ê瘮?shù),存在this指向問題,所以我就把vue的當(dāng)前實(shí)例給that了,that的使用和this一樣,就看成this就行

? ? ? this.socket.onopen = function() { ?
? ? ? ? console.log("WebScoket已經(jīng)成功連接!");?
? ? ? ? this.heart = setInterval(()=>{ that.socket.send('hello')},1000*30); // 每隔30秒就向服務(wù)器發(fā)送消息
? ? ? ? that.times = 0; // 在連接成功的時(shí)候改變成初始狀態(tài),如果重連就會(huì)增加
? ? ? ? that.isConn = true; // 同上,與上面的次數(shù)共同控制是否重連,我不可能一直嘗試重連,連接幾百次吧
? ? ? };

? ? ? this.socket.onmessage = function() { // 接收消息,觸發(fā)此回調(diào)
? ? ? ? console.log("接收到的消息為:hello");
? ? ? ? if(that.Tim){ // 初始值為0,也就是false,第一次不會(huì)執(zhí)行清理定時(shí)器
? ? ? ? ? clearTimeout(that.Tim);
? ? ? ? }
? ? ? ? that.Tim = setTimeout(()=>{ that.socket.onclose=()=>{ that.socket.close() }; },1000*33) // 只要接收到消息就會(huì)創(chuàng)建一個(gè)定時(shí)器,定時(shí)器的內(nèi)容是在33秒后關(guān)閉webscoket,但是如果在該時(shí)間內(nèi)接收到消息,那么就會(huì)再次執(zhí)行,會(huì)進(jìn)入上面的if,
? ? ? };?

? ? ? this.socket.onclose = function() {
? ? ? ? console.log("WebScoket已經(jīng)斷開連接");
? ? ? ? if(this.heart !== 0){?
? ? ? ? ? clearInterval(this.heart)
? ? ? ? }
? ? ? ? if(that.times < 5 && that.isConn){ // 每隔5秒就會(huì)重新連接,未連接成功就會(huì)次數(shù)增加,連接成功就會(huì)清零
? ? ? ? ? that.isConn = false; // 在定時(shí)器結(jié)束前,不允許再次執(zhí)行該函數(shù),這里應(yīng)該可以優(yōu)化
? ? ? ? ? setTimeout(function(){?
? ? ? ? ? ? that.times ++;
? ? ? ? ? ? console.log(`嘗試第${that.times}次重連!`)
? ? ? ? ? ? that.isConn = true;
? ? ? ? ? ? that.Init(that.path) // 執(zhí)行嘗試重新連接
? ? ? ? ? },5000)
? ? ? ? }else{
? ? ? ? ? this.isConn = false; // 貌似可以優(yōu)化
? ? ? ? ? this.socket.close(); // 徹底關(guān)閉
? ? ? ? }
? ? ? };

? ? ? this.socket.onerror = function() { // 這個(gè)刪了也不會(huì)報(bào)錯(cuò)
? ? ? ? console.log('WebSocket連接發(fā)生異常!');
??
? ? ? }; ? ? ?
? ? },
}
}

邏輯其實(shí)很簡單,就是有一點(diǎn)繞,聲明的變量稍微有點(diǎn)多,看懂了還是很簡單,

這些變量就像是一堆水龍頭,它是否放水,得要判斷,并且在不同的時(shí)候,給它不同的值。

如果不想搞懂也可以直接拿來用,關(guān)于時(shí)間地址改改就能用!

測試的話,需要在vue文件里面寫,打開控制臺(tái),然后斷網(wǎng)聯(lián)網(wǎng)模擬真實(shí)情況,就可以調(diào)試了

結(jié)果:

(報(bào)錯(cuò)是因?yàn)槲沂謩?dòng)開關(guān)了wifi,嘗試重連沒有問題,最后穩(wěn)定連接,對(duì)接收消息判斷,也沒有問題?。?/p>

到此這篇關(guān)于在Vue中使用WebScoket 的文章就介紹到這了,更多相關(guān)Vue使用WebScoket 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue實(shí)現(xiàn)登錄界面

    vue實(shí)現(xiàn)登錄界面

    這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)登錄界面,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • Vue 菜單欄點(diǎn)擊切換單個(gè)class(高亮)的方法

    Vue 菜單欄點(diǎn)擊切換單個(gè)class(高亮)的方法

    今天小編就為大家分享一篇Vue 菜單欄點(diǎn)擊切換單個(gè)class(高亮)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-08-08
  • vue antd Form表單的使用及說明

    vue antd Form表單的使用及說明

    這篇文章主要介紹了vue antd Form表單的使用及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • 在瀏覽器console中如何調(diào)用vue內(nèi)部方法

    在瀏覽器console中如何調(diào)用vue內(nèi)部方法

    這篇文章主要介紹了在瀏覽器console中如何調(diào)用vue內(nèi)部方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Vue.js使用計(jì)算屬性緩存結(jié)果的方法

    Vue.js使用計(jì)算屬性緩存結(jié)果的方法

    在Vue.js中,計(jì)算屬性(computed properties)是組件的重要組成部分,它們根據(jù)組件的數(shù)據(jù)自動(dòng)計(jì)算新的值,并在數(shù)據(jù)變化時(shí)自動(dòng)更新,本文將探討計(jì)算屬性的緩存機(jī)制,并通過有趣的示例展示如何利用計(jì)算屬性緩存結(jié)果,提升應(yīng)用性能,需要的朋友可以參考下
    2025-03-03
  • vue-router的兩種模式的區(qū)別

    vue-router的兩種模式的區(qū)別

    這篇文章主要介紹了vue-router的兩種模式的區(qū)別,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-05-05
  • webpack4+express+mongodb+vue實(shí)現(xiàn)增刪改查的示例

    webpack4+express+mongodb+vue實(shí)現(xiàn)增刪改查的示例

    這篇文章主要介紹了webpack4+express+mongodb+vue 實(shí)現(xiàn)增刪改查的示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-11-11
  • Vue3表單組件el-form校驗(yàn)規(guī)則rules屬性示例詳解

    Vue3表單組件el-form校驗(yàn)規(guī)則rules屬性示例詳解

    在el-form中正確使用rules校驗(yàn)是非常重要的,rules使用不當(dāng)容易出現(xiàn)規(guī)則不生效、規(guī)則一直被觸發(fā)等各種現(xiàn)象,這篇文章主要給大家介紹了關(guān)于Vue3表單組件el-form校驗(yàn)規(guī)則rules屬性的相關(guān)資料,需要的朋友可以參考下
    2024-08-08
  • 解決VUE框架 導(dǎo)致綁定事件的阻止冒泡失效問題

    解決VUE框架 導(dǎo)致綁定事件的阻止冒泡失效問題

    下面小編就為大家分享一篇vue監(jiān)聽滾動(dòng)事件 實(shí)現(xiàn)某元素吸頂或者固定位置顯示方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-02-02
  • 在使用vuex的時(shí)候出現(xiàn)commit未定義錯(cuò)誤的解決

    在使用vuex的時(shí)候出現(xiàn)commit未定義錯(cuò)誤的解決

    這篇文章主要介紹了在使用vuex的時(shí)候出現(xiàn)commit未定義錯(cuò)誤的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01

最新評(píng)論

石城县| 宾川县| 同心县| 南昌市| 南昌市| 镇沅| 越西县| 景德镇市| 密云县| 中牟县| 山东| 黄石市| 秦安县| 长乐市| 徐水县| 西乌| 汝州市| 丹巴县| 青龙| 古浪县| 六枝特区| 涞源县| 屏边| 富川| 清远市| 慈溪市| 迁西县| 白玉县| 安阳市| 安西县| 锦屏县| 民权县| 平利县| 贞丰县| 上杭县| 巧家县| 夏邑县| 南丹县| 瓦房店市| 阜城县| 宁海县|