Vue通過WebSocket建立長連接的實(shí)現(xiàn)代碼
使用場(chǎng)景:
在項(xiàng)目開發(fā)中,后端需要處理一連串的邏輯,或者等待第三方的數(shù)據(jù)返回來進(jìn)行處理之后在返回給前端,可能時(shí)間會(huì)很長,而且前端也不知道后端什么時(shí)候能處理好(時(shí)間長的話會(huì)達(dá)到10分鐘左右),如果采用普通的HTTP連接,前后端無法一直保持聯(lián)系,麻煩的時(shí)候可能還需要采用輪詢的機(jī)制,所以使用WebSocket連接效果還是比較好的。
使用時(shí)間:
在界面加載完之后,建上WebSocket連接,此時(shí)前端還可以發(fā)送普通的HTTP的請(qǐng)求,等到后端處理完之后,通過建立的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ù),防止連接斷開(這跟服務(wù)器的設(shè)置有關(guān),如果服務(wù)器沒有設(shè)置每隔多長時(shí)間不發(fā)消息斷開,可以不進(jìn)行心跳設(shè)置)
let self = this;
this.timer = setInterval(() => {
try {
self.websock.send('test')
console.log('發(fā)送消息');
}catch(err){
console.log('斷開了:' + 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("斷開連接", e);
}
},
created() {
if (this.websock) {
this.websock.close(); // 關(guān)閉websocket連接
}
this.initWebSocket();
},
destroyed() {
//頁面銷毀時(shí)關(guān)閉ws連接
if (this.websock) {
this.websock.close(); // 關(guān)閉websocket
}
}
};
</script>
問題回顧:
在實(shí)際使用的時(shí)候遇到的問題:有的時(shí)候頁面鏈接還沒有建立上,但是后端已經(jīng)把數(shù)據(jù)都處理好了,這個(gè)時(shí)候推給前端,前端接收不到。
解決方案:
1)簡單的方法:讓后端延遲幾秒再推
優(yōu)勢(shì):簡單
劣勢(shì):降低了性能
2)優(yōu)化之后的方法:使用Redis保存用戶的登錄狀態(tài),緩存這個(gè)用戶的數(shù)據(jù),等到建立連接之后再推,推完就清空Redis
總結(jié)
以上所述是小編給大家介紹的Vue通過WebSocket建立長連接的實(shí)現(xiàn)代碼,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!
相關(guān)文章
vue+iview實(shí)現(xiàn)手機(jī)號(hào)分段輸入框
這篇文章主要為大家詳細(xì)介紹了vue+iview實(shí)現(xiàn)手機(jī)號(hào)分段輸入框,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
vue?element-ui如何在el-tabs組件最右側(cè)添加按鈕
這篇文章主要介紹了vue?element-ui如何在el-tabs組件最右側(cè)添加按鈕問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
Vue實(shí)現(xiàn)兩個(gè)列表之間的數(shù)據(jù)聯(lián)動(dòng)的代碼示例
在Vue.js應(yīng)用開發(fā)中,列表數(shù)據(jù)的聯(lián)動(dòng)是一個(gè)常見的需求,這種聯(lián)動(dòng)可以用于多種場(chǎng)景,例如過濾篩選、關(guān)聯(lián)選擇等,本文將詳細(xì)介紹如何在Vue項(xiàng)目中實(shí)現(xiàn)兩個(gè)列表之間的數(shù)據(jù)聯(lián)動(dòng),并通過多個(gè)具體的代碼示例來幫助讀者理解其實(shí)現(xiàn)過程,需要的朋友可以參考下2024-10-10
vue中使用elementUI自定義校驗(yàn)及點(diǎn)擊提交不生效問題解決辦法
我們?cè)陧?xiàng)目中經(jīng)常會(huì)用到ElementUI的表單驗(yàn)證,下面這篇文章主要給大家介紹了關(guān)于vue中使用elementUI自定義校驗(yàn)及點(diǎn)擊提交不生效問題解決的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12

