Vue通過(guò)WebSocket建立長(zhǎng)連接的實(shí)現(xiàn)代碼
使用場(chǎng)景:
在項(xiàng)目開(kāi)發(fā)中,后端需要處理一連串的邏輯,或者等待第三方的數(shù)據(jù)返回來(lái)進(jìn)行處理之后在返回給前端,可能時(shí)間會(huì)很長(zhǎng),而且前端也不知道后端什么時(shí)候能處理好(時(shí)間長(zhǎng)的話會(huì)達(dá)到10分鐘左右),如果采用普通的HTTP連接,前后端無(wú)法一直保持聯(lián)系,麻煩的時(shí)候可能還需要采用輪詢的機(jī)制,所以使用WebSocket連接效果還是比較好的。
使用時(shí)間:
在界面加載完之后,建上WebSocket連接,此時(shí)前端還可以發(fā)送普通的HTTP的請(qǐng)求,等到后端處理完之后,通過(guò)建立的WebSocket連接返給前端,前端根據(jù)返回的數(shù)據(jù)進(jìn)行對(duì)應(yīng)的操作。
代碼展示:
<template>
</template>
<script>
export default {
data() {
return{
// 用戶Id
userId:'',
appid:'',
// 事件類型
type:'',
msg:'',
wsUrl:''
}
},
methods: {
//初始化weosocket
initWebSocket() {
if (typeof WebSocket === "undefined") {
alert("您的瀏覽器不支持WebSocket");
return false;
}
const wsuri = 'ws://(后端WebSocket地址)/websocket/' + this.userId + '/' + this.appid // websocket地址
this.websock = new WebSocket(wsuri);
this.websock.onopen = this.websocketonopen;
this.websock.onmessage = this.websocketonmessage;
this.websock.onerror = this.websocketonerror;
this.websock.onclose = this.websocketclose;
},
//連接成功
websocketonopen() {
console.log("WebSocket連接成功");
// 添加心跳檢測(cè),每30秒發(fā)一次數(shù)據(jù),防止連接斷開(kāi)(這跟服務(wù)器的設(shè)置有關(guān),如果服務(wù)器沒(méi)有設(shè)置每隔多長(zhǎng)時(shí)間不發(fā)消息斷開(kāi),可以不進(jìn)行心跳設(shè)置)
let self = this;
this.timer = setInterval(() => {
try {
self.websock.send('test')
console.log('發(fā)送消息');
}catch(err){
console.log('斷開(kāi)了:' + err);
self.connection()
}
}, 30000)
},
//接收后端返回的數(shù)據(jù),可以根據(jù)需要進(jìn)行處理
websocketonmessage(e) {
var vm = this;
let data1Json = JSON.parse(e.data);
console.log(data1Json);
},
//連接建立失敗重連
websocketonerror(e) {
console.log(`連接失敗的信息:`, e);
this.initWebSocket(); // 連接失敗后嘗試重新連接
},
//關(guān)閉連接
websocketclose(e) {
console.log("斷開(kāi)連接", e);
}
},
created() {
if (this.websock) {
this.websock.close(); // 關(guān)閉websocket連接
}
this.initWebSocket();
},
destroyed() {
//頁(yè)面銷毀時(shí)關(guān)閉ws連接
if (this.websock) {
this.websock.close(); // 關(guān)閉websocket
}
}
};
</script>
問(wèn)題回顧:
在實(shí)際使用的時(shí)候遇到的問(wèn)題:有的時(shí)候頁(yè)面鏈接還沒(méi)有建立上,但是后端已經(jīng)把數(shù)據(jù)都處理好了,這個(gè)時(shí)候推給前端,前端接收不到。
解決方案:
1)簡(jiǎn)單的方法:讓后端延遲幾秒再推
優(yōu)勢(shì):簡(jiǎn)單
劣勢(shì):降低了性能
2)優(yōu)化之后的方法:使用Redis保存用戶的登錄狀態(tài),緩存這個(gè)用戶的數(shù)據(jù),等到建立連接之后再推,推完就清空Redis
總結(jié)
以上所述是小編給大家介紹的Vue通過(guò)WebSocket建立長(zhǎng)連接的實(shí)現(xiàn)代碼,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺(jué)得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!
相關(guān)文章
vue使用Highcharts實(shí)現(xiàn)不同高度的3D環(huán)形圖
這篇文章主要為大家詳細(xì)介紹了vue使用Highcharts實(shí)現(xiàn)不同高度的3D環(huán)形圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
html-webpack-plugin修改頁(yè)面的title的方法
這篇文章主要介紹了html-webpack-plugin修改頁(yè)面的title的方法 ,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
vue項(xiàng)目在線上服務(wù)器訪問(wèn)失敗原因分析
這篇文章主要介紹了vue項(xiàng)目在線上服務(wù)器訪問(wèn)失敗原因分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08
Vue拖動(dòng)截圖功能的簡(jiǎn)單實(shí)現(xiàn)方法
最近項(xiàng)目上要做一個(gè)車牌識(shí)別的功能,就需要做拖動(dòng)截圖功能了,因?yàn)榍岸问莢ue,所以下面這篇文章主要給大家介紹了關(guān)于Vue拖動(dòng)截圖功能的簡(jiǎn)單實(shí)現(xiàn)方法,需要的朋友可以參考下2021-07-07
如何使用 Vue Router 的 meta 屬性實(shí)現(xiàn)多種功能
在Vue.js中,Vue Router 提供了強(qiáng)大的路由管理功能,通過(guò)meta屬性,我們可以在路由定義中添加自定義元數(shù)據(jù),以實(shí)現(xiàn)訪問(wèn)控制、頁(yè)面標(biāo)題設(shè)置、角色權(quán)限管理、頁(yè)面過(guò)渡效果,本文將總結(jié)如何使用 meta 屬性來(lái)實(shí)現(xiàn)這些常見(jiàn)的功能,感興趣的朋友一起看看吧2024-06-06
新版vue-cli模板下本地開(kāi)發(fā)環(huán)境使用node服務(wù)器跨域的方法
這篇文章主要介紹了新版vue-cli模板下本地開(kāi)發(fā)環(huán)境使用node服務(wù)器跨域的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-04-04
vue 實(shí)現(xiàn)click同時(shí)傳入事件對(duì)象和自定義參數(shù)
這篇文章主要介紹了vue 實(shí)現(xiàn)click同時(shí)傳入事件對(duì)象和自定義參數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01

