欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

vue 實現(xiàn)websocket發(fā)送消息并實時接收消息

 更新時間:2019年12月09日 13:14:49   作者:yemuxia_sinian  
這篇文章主要介紹了vue 實現(xiàn)websocket發(fā)送消息并實時接收消息,項目結(jié)合vue腳手架和websocket來搭建,本文給大家分享實例代碼,需要的朋友可以參考下

公司做了個數(shù)字貨幣行情的H5,需要用到websocket,剛好自己也不會,可以學習一下,美滋滋。

項目結(jié)合vue腳手架和websocket來搭建,主要遇到了兩個問題,一個是:斷開重連機制要如何處理;另外一個是:如何在頁面上隨時的發(fā)送消息并實時接收返回的數(shù)據(jù),斷開重連后又如何重新發(fā)送消息,接收消息

一、斷開重連機制處理 (詳細參考這里

寫一個重連的方法(重連方法中必須加一把鎖,重連方法執(zhí)行過程中不再執(zhí)行重連動作,避免重復(fù)連接),然后在websocket的onclose和error中綁定重連方法,這樣一般情況下,websocket斷開或者鏈接出錯就可以實現(xiàn)重連了。針對斷網(wǎng)重連問題,就需要用心跳檢測了(主要是利用websocket定時發(fā)送消息,當超過一定時間消息還未發(fā)送成功,瀏覽器的websocket會自動觸發(fā)onclose方法,而此時onclose有綁定了重連函數(shù),于是就觸發(fā)websocket重新連接),項目這邊暫時不考慮這個,所以沒做心跳檢測。

主要代碼:

let socket = null;
let lockReconnet = false; //避免重復(fù)連接
const wsUrl = '自己的websocket接口';
let createSocket = url=>{ //創(chuàng)建socket
 try{
 if('WebSocket' in window){
 socket = new WebSocket(url)
 }else if('MozWebSocket' in window){
 socket = new MozWebSocket(url)
 }
 initSocket()
 }catch(e){
 reconnet(url)
 }
}
let initSocket = ()=>{ //初始化websocket
 socket.onopen = ()=>{
 console.log('socket連接成功')
 //heartCheck.reset().start() //后端說暫時不需要做心跳檢測
 
 }
 
 socket.onmessage = (ev)=>{
 console.log(ev,'連接正常')
 //heartCheck.reset().start() //后端說暫時不需要做心跳檢測
 }
 
 socket.onerror = ()=>{
 console.log('websocket服務(wù)出錯了---onerror');
 reconnet(wsUrl) 
 }
 
 socket.onclose = ()=>{
 console.log('websocket服務(wù)關(guān)閉了+++onclose');
 reconnet(wsUrl)
 }
}
let reconnet = url=>{ //重新連接websock函數(shù)
 if(lockReconnet)
 return false
 lockReconnet = true
 setTimeout(()=>{
 createSocket(url)
 lockReconnet = false
 },2000)
}
let heartCheck = { //心跳檢測
 timeout: 60*1000,
 timeoutObj: null,
 serverTimeoutObj: null,
 reset(){
 clearTimeout(this.timeoutObj)
 clearTimeout(this.serverTimeoutObj)
 return this;
 },
 start(){
 let that = this;
 this.timeoutObj = setTimeout(()=>{
 //發(fā)送數(shù)據(jù),如果onmessage能接收到數(shù)據(jù),表示連接正常,然后在onmessage里面執(zhí)行reset方法清除定時器
 socket.send('heart check')
 this.serverTimeoutObj = setTimeout(()=>{
 socket.close()
 },that.timeout)
 },this.timeout)
 }
}

二、在頁面上隨時發(fā)送消息并實時接收消息

在上面代碼的基礎(chǔ)上增加一個發(fā)送數(shù)據(jù)的方法,該方法有兩個參數(shù),一個是需要發(fā)送的數(shù)據(jù);另一個為接收和處理返回數(shù)據(jù)的回調(diào)函數(shù),然后把這個方法暴露出去并掛載到Vue原型上,這樣就可以在任意頁面或者組件隨時的發(fā)送消息,并接收消息了。具體代碼:

let sendMsg = (data,callback)=>{ //發(fā)送數(shù)據(jù),接收處理數(shù)據(jù)
 if(socket.readyState===1){
 globalCallback = callback; //把接收處理回調(diào)函數(shù)保存到全局
 sendData = data; //把發(fā)送數(shù)據(jù)也保存到全局
 
 data = JSON.stringify(data);
 socket.send(data);
 }else{
 setTimeout(()=>{
 console.log(socket,'等待socket鏈接成功')
 sendMsg(data,callback)
 },1500)
 return false
 }
 socket.onmessage = ev=>{ //重新監(jiān)聽onmessage,并把數(shù)據(jù)傳給回調(diào)函數(shù)
 callback && callback(ev)
 }
}

三、斷開重連后如何重新發(fā)送消息和接收消息

增加一個保存要發(fā)送消息的全局變量,以及一個保存接收處理消息回調(diào)函數(shù)的全局變量,當重連觸發(fā)后,重新調(diào)用下senMsg方法,并把這兩個變量傳進去就可以了。

完整的封裝代碼(mysocket.js):

//import Vue from 'vue'
let socket = null;
let lockReconnet = false; //避免重復(fù)連接
const wsUrl = '自己的websocket接口';
let isReconnet = false;
let globalCallback = null,sendData = null; //把要發(fā)送給socket的數(shù)據(jù)和處理socket返回數(shù)據(jù)的回調(diào)保存起來
let createSocket = url=>{ //創(chuàng)建socket
 try{
 if('WebSocket' in window){
 socket = new WebSocket(url)
 }else if('MozWebSocket' in window){
 socket = new MozWebSocket(url)
 }
 //Vue.prototype.socket = socket //需要主動關(guān)閉的話就可以直接調(diào)用this.socket.close()進行關(guān)閉,不需要的話這個可以去掉
 initSocket()
 }catch(e){
 reconnet(url)
 }
}
let sendMsg = (data,callback)=>{ //發(fā)送數(shù)據(jù),接收數(shù)據(jù)
 if(socket.readyState===1){
 globalCallback = callback;
 sendData = data;
 
 data = JSON.stringify(data);
 socket.send(data);
 }else{
 setTimeout(()=>{
 console.log(socket,'等待socket鏈接成功')
 sendMsg(data,callback)
 },1500)
 return false
 }
 socket.onmessage = ev=>{
 callback && callback(ev)
 }
}
let initSocket = ()=>{ //初始化websocket
 socket.onopen = ()=>{
 console.log('socket連接成功')
 //heartCheck.reset().start() //后端說暫時不需要做心跳檢測
 
 if(isReconnet){//執(zhí)行全局回調(diào)函數(shù)
 //console.log('websocket重新連接了')
 sendMsg(sendData,globalCallback)
 isReconnet = false
 }
 }
 
 socket.onmessage = (ev)=>{
 console.log(ev,'連接正常')
 //heartCheck.reset().start() //后端說暫時不需要做心跳檢測
 }
 
 socket.onerror = ()=>{
 console.log('websocket服務(wù)出錯了---onerror');
 reconnet(wsUrl) 
 }
 
 socket.onclose = ()=>{
 console.log('websocket服務(wù)關(guān)閉了+++onclose');
 reconnet(wsUrl)
 }
}
let reconnet = url=>{ //重新連接websock函數(shù)
 if(lockReconnet)
 return false
 
 isReconnet = true;
 lockReconnet = true
 setTimeout(()=>{
 createSocket(url)
 lockReconnet = false
 },2000)
}
let heartCheck = { //心跳檢測
 timeout: 60*1000,
 timeoutObj: null,
 serverTimeoutObj: null,
 reset(){
 clearTimeout(this.timeoutObj)
 clearTimeout(this.serverTimeoutObj)
 return this;
 },
 start(){
 let that = this;
 this.timeoutObj = setTimeout(()=>{
 //發(fā)送數(shù)據(jù),如果onmessage能接收到數(shù)據(jù),表示連接正常,然后在onmessage里面執(zhí)行reset方法清除定時器
 socket.send('heart check')
 this.serverTimeoutObj = setTimeout(()=>{
 socket.close()
 },that.timeout)
 },this.timeout)
 }
}
createSocket(wsUrl)
export default {sendMsg}

在main.js里面引入這個文件,并把sendMsg掛載到Vue原型上,就可以再頁面上隨時發(fā)送消息接收消息了。

import socket from './assets/js/mysocket'
Vue.prototype.sendMsg = socket.sendMsg

在頁面上調(diào)用方法:

getSocketData(symbol){
 let data = {"event":"subscription","data":"market.kline."+symbol};
 this.sendMsg(data,ev=>{
 console.log(JSON.parse(ev.data),'K線相關(guān)數(shù)據(jù)')
 })
 }

效果: 

總結(jié)

以上所述是小編給大家介紹的vue 實現(xiàn)websocket發(fā)送消息并實時接收消息,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!

相關(guān)文章

  • 解決vue做詳情頁跳轉(zhuǎn)的時候使用created方法 數(shù)據(jù)不會更新問題

    解決vue做詳情頁跳轉(zhuǎn)的時候使用created方法 數(shù)據(jù)不會更新問題

    這篇文章主要介紹了解決vue做詳情頁跳轉(zhuǎn)的時候使用created方法 數(shù)據(jù)不會更新問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • vue返回首頁后如何清空路由問題

    vue返回首頁后如何清空路由問題

    這篇文章主要介紹了vue返回首頁后如何清空路由問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • vue-image-crop基于Vue的移動端圖片裁剪組件示例

    vue-image-crop基于Vue的移動端圖片裁剪組件示例

    這篇文章主要介紹了vue-image-crop基于Vue的移動端圖片裁剪組件示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-08-08
  • vue實現(xiàn)鼠標懸浮框效果

    vue實現(xiàn)鼠標懸浮框效果

    這篇文章主要為大家詳細介紹了vue實現(xiàn)鼠標懸浮框,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • vue中數(shù)據(jù)請求axios的封裝和使用

    vue中數(shù)據(jù)請求axios的封裝和使用

    這篇文章主要介紹了vue中數(shù)據(jù)請求axios的封裝和使用,Axios?是一個基于?promise?的?HTTP?庫,下面文章圍繞主題的相關(guān)資料展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-04-04
  • vue3中實現(xiàn)音頻播放器APlayer的方法

    vue3中實現(xiàn)音頻播放器APlayer的方法

    這篇文章主要介紹了vue3中實現(xiàn)音頻播放器APlayer的方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-08-08
  • vite+vue3全局定義less變量在單文件中使用方式

    vite+vue3全局定義less變量在單文件中使用方式

    這篇文章主要介紹了vite+vue3全局定義less變量在單文件中使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • vue-cli項目修改文件熱重載失效的解決方法

    vue-cli項目修改文件熱重載失效的解決方法

    今天小編就為大家分享一篇vue-cli項目修改文件熱重載失效的解決方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-09-09
  • Vue腳手架的創(chuàng)建超詳解步驟

    Vue腳手架的創(chuàng)建超詳解步驟

    這篇文章主要給大家介紹了關(guān)于Vue腳手架創(chuàng)建的相關(guān)資料,Vue腳手架是vue官方提供的標準化開發(fā)工具(平臺),文中通過代碼以及圖文介紹的非常詳細,需要的朋友可以參考下
    2024-01-01
  • vue+element導(dǎo)航欄高亮顯示的解決方式

    vue+element導(dǎo)航欄高亮顯示的解決方式

    今天小編就為大家分享一篇vue+element導(dǎo)航欄高亮顯示的解決方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11

最新評論