久久久精品一区ed2k-女人被男人叉到高潮的视频-中文字幕乱码一区久久麻豆樱花-俄罗斯熟妇真实视频

怎么在vue中使用websocket發(fā)送消息

本篇文章為大家展示了怎么在vue中使用websocket發(fā)送消息,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。

為尉氏等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及尉氏網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為成都做網(wǎng)站、網(wǎng)站制作、尉氏網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!

一、斷開(kāi)重連機(jī)制處理

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

主要代碼:

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() //后端說(shuō)暫時(shí)不需要做心跳檢測(cè)
 
 }
 
 socket.onmessage = (ev)=>{
 console.log(ev,'連接正常')
 //heartCheck.reset().start() //后端說(shuō)暫時(shí)不需要做心跳檢測(cè)
 }
 
 socket.onerror = ()=>{
 console.log('websocket服務(wù)出錯(cuò)了---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 = { //心跳檢測(cè)
 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方法清除定時(shí)器
 socket.send('heart check')
 this.serverTimeoutObj = setTimeout(()=>{
 socket.close()
 },that.timeout)
 },this.timeout)
 }
}

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

在上面代碼的基礎(chǔ)上增加一個(gè)發(fā)送數(shù)據(jù)的方法,該方法有兩個(gè)參數(shù),一個(gè)是需要發(fā)送的數(shù)據(jù);另一個(gè)為接收和處理返回?cái)?shù)據(jù)的回調(diào)函數(shù),然后把這個(gè)方法暴露出去并掛載到Vue原型上,這樣就可以在任意頁(yè)面或者組件隨時(shí)的發(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)聽(tīng)onmessage,并把數(shù)據(jù)傳給回調(diào)函數(shù)
 callback && callback(ev)
 }
}

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

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

完整的封裝代碼(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返回?cái)?shù)據(jù)的回調(diào)保存起來(lái)
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 //需要主動(dòng)關(guān)閉的話就可以直接調(diào)用this.socket.close()進(jìn)行關(guān)閉,不需要的話這個(gè)可以去掉
 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() //后端說(shuō)暫時(shí)不需要做心跳檢測(cè)
 
 if(isReconnet){//執(zhí)行全局回調(diào)函數(shù)
 //console.log('websocket重新連接了')
 sendMsg(sendData,globalCallback)
 isReconnet = false
 }
 }
 
 socket.onmessage = (ev)=>{
 console.log(ev,'連接正常')
 //heartCheck.reset().start() //后端說(shuō)暫時(shí)不需要做心跳檢測(cè)
 }
 
 socket.onerror = ()=>{
 console.log('websocket服務(wù)出錯(cuò)了---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 = { //心跳檢測(cè)
 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方法清除定時(shí)器
 socket.send('heart check')
 this.serverTimeoutObj = setTimeout(()=>{
 socket.close()
 },that.timeout)
 },this.timeout)
 }
}
createSocket(wsUrl)
export default {sendMsg}

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

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

在頁(yè)面上調(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ù)')
 })
 }

上述內(nèi)容就是怎么在vue中使用websocket發(fā)送消息,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

當(dāng)前文章:怎么在vue中使用websocket發(fā)送消息
文章網(wǎng)址:http://sd-ha.com/article18/geecgp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、網(wǎng)站建設(shè)、外貿(mào)建站、品牌網(wǎng)站建設(shè)做網(wǎng)站、網(wǎng)頁(yè)設(shè)計(jì)公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁(yè)設(shè)計(jì)