在Vue中使用WebScoket?會怎么樣?
最近項(xiàng)目中使用到了webscoket
,這個東西吧,用起來也很簡單。
但是我發(fā)現(xiàn),這個東西會因?yàn)榫W(wǎng)絡(luò)的不穩(wěn)定而斷開連接,斷開就斷開吧,關(guān)鍵是斷開了,webscoket
不會出現(xiàn)異常。
于是就要自己去檢測,這個有沒有掉線。
我的想法是,每隔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)行自動重連 ? ? ? heart:0, ? ? ? // 接收定時器,用來檢測WebScoket是否斷線 ? ? ? Tim:0, ? ? ? ? // 用于判斷是否接收消息的定時器 ? ? } ? }, ? mounted(){ ? ? this.path = 'ws://82.157.123.54:9010/ajaxchattest'; // 測試地址,百度上可以搜索到 ? ? //this.path = 'ws://' + window.location.hostname + '/devices/history'; // 獲取瀏覽器當(dāng)前地址,因?yàn)楹笈_ip可能不固定,如果固定可以寫死,就像上面那樣,但是如果ip動態(tài),則可以使用這個,上線使用 ? ? this.Init(this.path); // 掛載時,初始化數(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; // 在連接成功的時候改變成初始狀態(tài),如果重連就會增加 ? ? ? ? that.isConn = true; // 同上,與上面的次數(shù)共同控制是否重連,我不可能一直嘗試重連,連接幾百次吧 ? ? ? }; ? ? ? this.socket.onmessage = function() { // 接收消息,觸發(fā)此回調(diào) ? ? ? ? console.log("接收到的消息為:hello"); ? ? ? ? if(that.Tim){ // 初始值為0,也就是false,第一次不會執(zhí)行清理定時器 ? ? ? ? ? clearTimeout(that.Tim); ? ? ? ? } ? ? ? ? that.Tim = setTimeout(()=>{ that.socket.onclose=()=>{ that.socket.close() }; },1000*33) // 只要接收到消息就會創(chuàng)建一個定時器,定時器的內(nèi)容是在33秒后關(guān)閉webscoket,但是如果在該時間內(nèi)接收到消息,那么就會再次執(zhí)行,會進(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秒就會重新連接,未連接成功就會次數(shù)增加,連接成功就會清零 ? ? ? ? ? that.isConn = false; // 在定時器結(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() { // 這個刪了也不會報錯 ? ? ? ? console.log('WebSocket連接發(fā)生異常!'); ?? ? ? ? }; ? ? ? ? ? }, } }
邏輯其實(shí)很簡單,就是有一點(diǎn)繞,聲明的變量稍微有點(diǎn)多,看懂了還是很簡單,
這些變量就像是一堆水龍頭,它是否放水,得要判斷,并且在不同的時候,給它不同的值。
如果不想搞懂也可以直接拿來用,關(guān)于時間地址改改就能用!
測試的話,需要在vue文件里面寫,打開控制臺,然后斷網(wǎng)聯(lián)網(wǎng)模擬真實(shí)情況,就可以調(diào)試了
結(jié)果:
(報錯是因?yàn)槲沂謩娱_關(guān)了wifi,嘗試重連沒有問題,最后穩(wěn)定連接,對接收消息判斷,也沒有問題?。?/p>
到此這篇關(guān)于在Vue中使用WebScoket 的文章就介紹到這了,更多相關(guān)Vue使用WebScoket 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue.js根據(jù)代碼運(yùn)行環(huán)境選擇baseurl的方法
本篇文章主要介紹了vue.js根據(jù)代碼運(yùn)行環(huán)境選擇baseurl的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-02-02vue踩坑記錄之echarts動態(tài)數(shù)據(jù)刷新問題
這篇文章主要介紹了vue踩坑記錄之echarts動態(tài)數(shù)據(jù)刷新問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07Vue?基于?vuedraggable?實(shí)現(xiàn)選中、拖拽、排序效果
這篇文章主要介紹了Vue?基于?vuedraggable?實(shí)現(xiàn)選中、拖拽、排序效果,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-05-05基于Vue 2.0 監(jiān)聽文本框內(nèi)容變化及ref的使用說明介紹
今天小編就為大家分享一篇基于Vue 2.0 監(jiān)聽文本框內(nèi)容變化及ref的使用說明介紹,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08移動端底部導(dǎo)航固定配合vue-router實(shí)現(xiàn)組件切換功能
經(jīng)常遇到這樣的需求,移動端中的導(dǎo)航并不是在頂部也不是在底部,而是在最底部且是固定的,當(dāng)我們點(diǎn)擊該導(dǎo)航項(xiàng)時會切換到對應(yīng)的組件。這篇文章主要介紹了移動端底部導(dǎo)航固定配合vue-router實(shí)現(xiàn)組件切換功能,需要的朋友可以參考下2019-06-06element-ui?el-upload實(shí)現(xiàn)上傳文件及簡單的上傳文件格式驗(yàn)證功能
前端上傳文件后,后端接受文件進(jìn)行處理后直接返回處理后的文件,前端直接再將文件下載下來,下面這篇文章主要給大家介紹了關(guān)于element-ui?el-upload實(shí)現(xiàn)上傳文件及簡單的上傳文件格式驗(yàn)證功能的相關(guān)資料,需要的朋友可以參考下2022-11-11