最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue項(xiàng)目使用websocket連接問(wèn)題及解決

 更新時(shí)間:2022年10月10日 11:00:57   作者:晚上八點(diǎn)半  
這篇文章主要介紹了vue項(xiàng)目使用websocket連接問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

vue使用websocket連接

前景 

公司做一個(gè)包含websocket的項(xiàng)目,我用的是vue做的,開(kāi)始只有一個(gè)組件的要求demo,就將websocket的配置直接放在組件方法中,組件掛載時(shí)直接初始化ws,但是后續(xù)組件增加,開(kāi)始出現(xiàn)多個(gè)websocket鏈接的情況,是不允許的。

剛開(kāi)始的做法是將websocket的方法配置等封裝為一個(gè)js文件給各個(gè)組件調(diào)用,當(dāng)離開(kāi)組件頁(yè)面進(jìn)入新頁(yè)面時(shí)會(huì)斷連舊的ws新建一個(gè)ws,以為做到了獨(dú)立,但是實(shí)際上確實(shí)多次的斷連鏈接,十分不便。

思考了挺久找到了解決方法,在此記錄加深記憶

解決過(guò)程

要求整個(gè)vue項(xiàng)目使用一個(gè)ws鏈接,在各組件都要求可以接受發(fā)送消息

首先想到的就是在app.vue下創(chuàng)建我是鏈接,然后給各個(gè)小的組件使用ws,做到統(tǒng)一,很簡(jiǎn)單的解決思路,我是這么做的

前期已經(jīng)將ws封裝成一個(gè)wsconnect.js文件了,那么是否可以將wsconnect注冊(cè)為全局的方法呢,試了一下果真可行,只需要在main.js中配置:

import wsConnect from "@/assets/js/wsConnect";
Vue.prototype.$ws = wsConnect
?
new Vue({
? render: h => h(App),
? router,
? axios,
? store
}).$mount('#app')

說(shuō)明一下,在wsconnect.js文件中我封裝了方法,但是把ws對(duì)象放在了vuex的state中,相關(guān)配置如下:

wsconnect.js:

import axios from "axios";
import store from "@/store";
?
//websocket
?
function initWebpack(){
? ? var url = store.state.url
? ? var wsurl = ''
? ? axios.get(`${url}/bcall/url`) ?//這是我在從后端拿ws鏈接的地址
? ? ? ? .then((res) => ?{
? ? ? ? ? ? console.log(res.data.data)
? ? ? ? ? ? wsurl = res.data.data
? ? ? ? ? ? store.state.ws = new WebSocket(wsurl);
? ? ? ? ? ? store.state.ws.onopen = onopen;
? ? ? ? ? ? store.state.ws.onmessage = onmessage;
? ? ? ? ? ? store.state.ws.onclose = onclose;
? ? ? ? ? ? store.state.ws.onerror = onerror;
?
? ? ? ? }).catch((err)=> {
? ? ? ? console.log(err)
? ? })
?
}
function onopen() {
? ? console.log("連接websocket");
? ? var params = '{"reqtype":"Query","action":"allexts"}'
? ? store.state.ws.send(params)
? ? start();
}
function reconnect() {//重新連接
? ? var that = store.state;
? ? if(that.lockReconnect) {
? ? ? ? return;
? ? }
? ? that.lockReconnect = true;
? ? //沒(méi)連接上會(huì)一直重連,設(shè)置延遲避免請(qǐng)求過(guò)多
? ? that.timeoutnum && clearTimeout(that.timeoutnum);
? ? that.timeoutnum = setTimeout(function () {
? ? ? ? //新連接
? ? ? ? initWebpack();
? ? ? ? that.lockReconnect = false;
? ? ? ? that.isFirstGet = true
? ? },5000);
}
function reset(){//重置心跳
? ? var that = store.state;
? ? //清除時(shí)間
? ? clearTimeout(that.timeoutObj);
? ? clearTimeout(that.serverTimeoutObj);
? ? //重啟心跳
? ? start();
}
function start(){ //開(kāi)啟心跳
? ? console.log('開(kāi)啟心跳');
? ? var self = store.state;
? ? self.timeoutObj && clearTimeout(self.timeoutObj);
? ? self.serverTimeoutObj && clearTimeout(self.serverTimeoutObj);
? ? self.timeoutObj = setTimeout(function(){
? ? ? ? //這里發(fā)送一個(gè)心跳,后端收到后,返回一個(gè)心跳消息,
? ? ? ? if (self.ws.readyState === 1) {//如果連接正常
? ? ? ? ? ??
? ? ? ? ? ? self.ws.send(heartbeat); //心跳包格式需要自己確定
?
? ? ? ? }else{//否則重連
? ? ? ? ? ? reconnect();
? ? ? ? }
? ? ? ? self.serverTimeoutObj = setTimeout(function() {
? ? ? ? ? ? //超時(shí)關(guān)閉
? ? ? ? ? ? self.ws.close();
? ? ? ? ? ? reconnect()
? ? ? ? }, self.timeout);
? ? }, self.timeout)
}
function onmessage(e) {
? ? console.log('接收數(shù)據(jù)',e)
? ? //處理數(shù)據(jù)的地方
? ? reset();
}
function onclose(e) {
? ? console.log('websocket 斷開(kāi): ',e);
?
}
function onerror(e) {
? ? console.log("出現(xiàn)錯(cuò)誤");
? ? //重連
? ? reconnect();
}
?
?
export default {
? ? initWebpack,
? ? onmessage,
? ? onclose,
? ? onopen,
? ? onerror
}

store.state:

state: {
? ? ? ? permissions: false,
? ? ? ? url: '',
? ? ? ? //ws參數(shù)
? ? ? ? path: '',
? ? ? ? ws: null,//建立的連接
? ? ? ? lockReconnect: false,//是否真正建立連接
? ? ? ? timeout: 58*1000,//58秒一次心跳
? ? ? ? timeoutObj: null,//心跳心跳倒計(jì)時(shí)
? ? ? ? serverTimeoutObj: null,//心跳倒計(jì)時(shí)
? ? ? ? timeoutnum: null,//斷開(kāi) 重連倒計(jì)時(shí)
?
? ? },

配置之后我在app.vue掛載之后直接初始化ws鏈接:

mounted() {
? ? this.$ws.initWebpack()
? }

發(fā)現(xiàn)是成功的,已經(jīng)將ws鏈接上了,接著就是在各個(gè)組件測(cè)試一下發(fā)送數(shù)據(jù)的功能:

this.$store.state.ws.send(msg)

神奇的發(fā)現(xiàn),也成功了!

之所以這么簡(jiǎn)單,前期的封裝也是占功勞的嘛,至此我的vue只需要一個(gè)ws鏈接就可以供整個(gè)項(xiàng)目使用,雖然不知道別人的做法是怎么樣,如果有更好的方法也希望大家講解下

vue2全局使用websocket記錄

1、考慮到登錄之后要始終連接服務(wù)器接收消息,所以把websocket實(shí)例對(duì)象作為模塊拋出,在main.js中引入,使全局都可以獲得ws并且使用相關(guān)方法。

2、由于刷新頁(yè)面時(shí),ws會(huì)自動(dòng)斷開(kāi)連接,所以在App.vue組件掛載時(shí)再次連接服務(wù)器。

新建ws模塊文件

該文件位置任意,引入的時(shí)候注意路徑即可

export default {
? ? ws: {},
? ? setWs: function(newWs) {
? ? ? ? this.ws = newWs
? ? },
? ? start(){// 發(fā)送心跳
? ? ? ? clearInterval(this.timeoutObj)
? ? ? ? this.timeoutObj = setInterval(() => {
? ? ? ? ? ? if (this.ws && this.ws.readyState == 1) {
? ? ? ? ? ? ? ? console.log('發(fā)送心跳')
? ? ? ? ? ? ? ? this.ws.send(JSON.stringify({
? ? ? ? ? ? ? ? ? ? //后端需要接收的數(shù)據(jù)
? ? ? ? ? ? ? ? }));
? ? ? ? ? ? }
? ? ? ? }, 10 *1000)//十秒發(fā)一次
? ? },
? ? localSocket(userId) {//連接ws,根據(jù)連接服務(wù)器是否需要參數(shù)設(shè)置該方法是否需要接收參數(shù)
? ? ? ? if ("WebSocket" in window) {
? ? ? ? ? ? // console.log("您的瀏覽器支持 WebSocket!");
? ? ? ? ? ? // location.host
? ? ? ? ? ? this.ws = new WebSocket('這里要填連接服務(wù)器的地址');
? ? ? ? ? ? this.setWs(this.ws);
? ? ? ? ? ? this.ws.onopen = ()=>{
? ? ? ? ? ? ? ? console.log('websocket連接成功');
? ? ? ? ? ? ? ? //連接上之后要發(fā)心跳包
? ? ? ? ? ? ? ? this.start()
? ? ? ? ? ? };
? ? ? ? ? ? this.ws.onclose = function () {
? ? ? ? ? ? ? ? // 關(guān)閉 websocket
? ? ? ? ? ? ? ? console.log("連接已關(guān)閉...");
? ? ? ? ? ? ? ? //斷線重新連接
? ? ? ? ? ? ? ? setTimeout(() => {
? ? ? ? ? ? ? ? ? ? this.localSocket(userId);
? ? ? ? ? ? ? ? }, 2000);
? ? ? ? ? ? };
? ? ? ? } else {
? ? ? ? ? ? // 瀏覽器不支持 WebSocket
? ? ? ? ? ? console.log("您的瀏覽器不支持 WebSocket!");
? ? ? ? ? ? this.openNotificationWithIcon('error', '瀏覽器', '您的瀏覽器不支持顯示消息請(qǐng)更換', 1,1)
? ? ? ? }
? ? },
}?

在main.js中引用ws模塊文件

import global from './ws.js'
Vue.prototype.global = global

App.vue掛載時(shí)再次連接服務(wù)器并且接收消息

mounted(){
? ? ? this.global.localSocket(userId)
? ? ? //連上之后要接收服務(wù)器發(fā)來(lái)的消息
? ? ? this.global.ws.onmessage = (msg)=>{
? ? ? ? ? console.log(JSON.parse(msg.data))
? ? ? ?}
}

通過(guò)以上方法,任何組件都可以通過(guò)this.global.ws獲得websocket實(shí)例對(duì)象并且使用相關(guān)方法,可能會(huì)有些問(wèn)題,但是我別的問(wèn)題太多了,這個(gè)先放一下吧。 

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。 

相關(guān)文章

  • 詳解Vue后臺(tái)管理系統(tǒng)開(kāi)發(fā)日??偨Y(jié)(組件PageHeader)

    詳解Vue后臺(tái)管理系統(tǒng)開(kāi)發(fā)日??偨Y(jié)(組件PageHeader)

    這篇文章主要介紹了詳解Vue后臺(tái)管理系統(tǒng)開(kāi)發(fā)日常總結(jié)(組件PageHeader),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • 如何在Vue中使用protobuf

    如何在Vue中使用protobuf

    這篇文章主要介紹了如何在Vue中使用protobuf,protobuf是由google推出的和語(yǔ)言無(wú)關(guān)和平臺(tái)無(wú)關(guān),幾乎支持當(dāng)前的大部分語(yǔ)言,如JavaScript,下文更多相關(guān)介紹需要的小伙伴可以參考一下
    2022-03-03
  • 使用vue-print-nb打印el-table問(wèn)題總結(jié)

    使用vue-print-nb打印el-table問(wèn)題總結(jié)

    這篇文章主要介紹了使用vue-print-nb打印el-table問(wèn)題總結(jié),通過(guò)實(shí)例代碼介紹了vue-print-nb 打印功能,本文結(jié)合實(shí)例代碼講解的非常詳細(xì),感興趣的朋友一起看看吧
    2024-01-01
  • VUE3使用JSON編輯器的詳細(xì)圖文教程

    VUE3使用JSON編輯器的詳細(xì)圖文教程

    最近項(xiàng)目中有用到j(luò)son編輯器,我選用了這款vue的編輯器,看起來(lái)也是比較簡(jiǎn)潔,接下來(lái)就具體介紹一下它,下面這篇文章主要給大家介紹了關(guān)于VUE3使用JSON編輯器的詳細(xì)圖文教程,需要的朋友可以參考下
    2023-04-04
  • 解決vue頁(yè)面刷新產(chǎn)生白屏的問(wèn)題

    解決vue頁(yè)面刷新產(chǎn)生白屏的問(wèn)題

    這篇文章主要介紹了解決vue頁(yè)面刷新產(chǎn)生白屏的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Vue pinia模塊化全局注冊(cè)詳解

    Vue pinia模塊化全局注冊(cè)詳解

    這篇文章主要介紹了Vue pinia模塊化全局注冊(cè),Pinia是Vue.js團(tuán)隊(duì)成員專門(mén)為Vue開(kāi)發(fā)的一個(gè)全新的狀態(tài)管理庫(kù),并且已經(jīng)被納入官方github
    2023-02-02
  • vue+php實(shí)現(xiàn)的微博留言功能示例

    vue+php實(shí)現(xiàn)的微博留言功能示例

    這篇文章主要介紹了vue+php實(shí)現(xiàn)的微博留言功能,結(jié)合完整實(shí)例形式分析了vue.js前臺(tái)留言及后臺(tái)php交互功能相關(guān)操作技巧,需要的朋友可以參考下
    2019-03-03
  • Pinia介紹及工作原理解析

    Pinia介紹及工作原理解析

    這篇文章主要為大家介紹了Pinia介紹及工作原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • Vue3中Cesium地圖初始化及地圖控件配置方法

    Vue3中Cesium地圖初始化及地圖控件配置方法

    本文中,我們主要介紹Cesium在Vue3運(yùn)行環(huán)境的配置,及Cesium實(shí)例中控件的顯隱設(shè)置,本項(xiàng)目基于pnpm安裝,也可使用其他包管理器進(jìn)行安裝,如npm或yarn,本文通過(guò)示例代碼對(duì)vue初始化Cesium地圖相關(guān)知識(shí)介紹的非常詳細(xì),需要的朋友參考下吧
    2023-07-07
  • 基于Vue3.0開(kāi)發(fā)輕量級(jí)手機(jī)端彈框組件V3Popup的場(chǎng)景分析

    基于Vue3.0開(kāi)發(fā)輕量級(jí)手機(jī)端彈框組件V3Popup的場(chǎng)景分析

    這篇文章主要介紹了基于Vue3.0開(kāi)發(fā)輕量級(jí)手機(jī)端彈框組件V3Popup,本文通過(guò)場(chǎng)景分析給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12

最新評(píng)論

金平| 白山市| 巢湖市| 永城市| 当雄县| 蓬安县| 武城县| 成安县| 柯坪县| 泌阳县| 龙泉市| 读书| 浠水县| 沛县| 吉隆县| 铅山县| 定州市| 达孜县| 东乡族自治县| 嘉兴市| 三原县| 鹤岗市| 忻城县| 无极县| 宜州市| 鹤庆县| 城步| 伊春市| 九台市| 柳江县| 武功县| 水富县| 尼勒克县| 尉氏县| 双桥区| 潞西市| 惠东县| 桂阳县| 万盛区| 金乡县| 高州市|