国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

vue3:websocket的封裝與使用

這篇具有很好參考價(jià)值的文章主要介紹了vue3:websocket的封裝與使用。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

前言:vue3+pinia項(xiàng)目

1.引入ws

yarn add ws

2.新建websocket.js類

let webSock = null;
let global_callback = null;
let isConnect = false; //連接標(biāo)識(shí) 避免重復(fù)連接
let rec; //斷線重連后,延遲5秒重新創(chuàng)建WebSocket連接  rec用來(lái)存儲(chǔ)延遲請(qǐng)求的代碼
let socketParams = {
  pageKey: -1
};
let isActiveClose = false; // 是否主動(dòng)關(guān)閉socket


let serverPort = "8080"; // webSocket連接端口
let wsUri = "ws://" + "xxx.xx.xx.xx" + ":" + serverPort;
// let serverPort = "8081"; // webSocket連接端口
// let wsUri = "ws://" + "192.168.50.156" + ":" + serverPort;

function createWebSocket(callback) {
  if (webSock == null || Object.prototype.toString.call(webSock) !== "[object WebSocket]") {
    initWebSocket(callback);
  }
}

function initWebSocket(callback) {
  log("init webSocket");
  global_callback = callback;
  // 初始化websocket
  webSock = new WebSocket(`${wsUri}?Authorization=${填寫登錄令牌token}`);
  webSock.onmessage = function(e) {
    websocketOnMessage(e);
  };
  webSock.onclose = function(e) {
    websocketClose(e);
  };
  webSock.onopen = function() {
    websocketOpen();
  };

  // 連接發(fā)生錯(cuò)誤的回調(diào)方法
  webSock.onerror = function() {
    websocketError();
  };
}


//心跳設(shè)置
const heartCheck = {
  timeout: 20000, //每段時(shí)間發(fā)送一次心跳包 這里設(shè)置為20s
  timeoutObj: null, //延時(shí)發(fā)送消息對(duì)象(啟動(dòng)心跳新建這個(gè)對(duì)象,收到消息后重置對(duì)象)

  start: function() {
    this.timeoutObj = setInterval(function() {
      if (isConnect) webSock.send(JSON.stringify(socketParams));
    }, this.timeout);
  },

  reset: function() {
    clearTimeout(this.timeoutObj);
    this.start();
  }
};

//定義重連函數(shù)
let reConnect = () => {
  log("嘗試重新連接");
  if (isConnect) return; //如果已經(jīng)連上就不在重連了
  rec && clearTimeout(rec);
  rec = setTimeout(function() { // 延遲5秒重連  避免過多次過頻繁請(qǐng)求重連
    if (!isConnect) {
      initWebSocket();
    }
  }, 5000);
};

// 實(shí)際調(diào)用的方法
function sendSock(agentData) {
  if (webSock.readyState === webSock.OPEN) {
    // 若是ws開啟狀態(tài)
    websocketSend(agentData);
  } else if (webSock.readyState === webSock.CONNECTING) {
    // 若是 正在開啟狀態(tài),則等待1s后重新調(diào)用
    setTimeout(function() {
      sendSock(agentData);
    }, 1000);
  } else {
    // 若未開啟 ,則等待1s后重新調(diào)用
    setTimeout(function() {
      sendSock(agentData);
    }, 1000);
  }
}

function closeSock({ activeClose = false }) {
  log(`關(guān)閉了 activeClose = ${activeClose}`);
  isActiveClose = activeClose;
  // 清除心跳定時(shí)器
  heartCheck.timeoutObj && clearTimeout(heartCheck.timeoutObj);
  // 清除重連定時(shí)器
  rec && clearTimeout(rec);
  if (isActiveClose) {
    // 關(guān)閉socket
    webSock.close();
  }
  // 初始化相關(guān)變量
  webSock = null;
  isConnect = false;
}

// 數(shù)據(jù)接收
function websocketOnMessage(msg) {
  // global_callback(JSON.parse(msg.data));
  if (!msg || !msg.data) {
    // 可能得情況 - 心跳機(jī)制、無(wú)關(guān)信息接收
    log("收到數(shù)據(jù):空消息");
    return;
  }
  log("收到數(shù)據(jù):"+ msg.data);
  // 收到信息為Blob類型時(shí)
  let result = null;
  if (msg.data instanceof Blob) {
    const reader = new FileReader();
    reader.readAsText(msg.data, "UTF-8");
    reader.onload = (e) => {
      result = JSON.parse(reader.result);
      //console.log("websocket收到", result);
      global_callback(result);
    };
  } else {
    result = JSON.parse(msg.data);
    //console.log("websocket收到", result);
    global_callback(result);
  }
}

// 數(shù)據(jù)發(fā)送
function websocketSend(agentData) {
  log("發(fā)送數(shù)據(jù):" + agentData);
  webSock.send(agentData);
}

// 關(guān)閉
function websocketClose(e) {
  log("connection closed (" + e.code + ")");
  if (isActiveClose) {
    isActiveClose = false;
    return;
  }
  closeSock({ activeClose: false });
  // 執(zhí)行重連
  reConnect();
}

const websocketError = () => {
  log("WebSocket連接發(fā)生錯(cuò)誤");
  closeSock({ activeClose: true });
  // 執(zhí)行重連
  reConnect();
}

function websocketOpen(e) {
  log("連接打開");
  isConnect = true;
  heartCheck.start(); //發(fā)送心跳 看個(gè)人項(xiàng)目需求
}

export { sendSock, createWebSocket, closeSock };

3.新建一個(gè)pinia?Store類

export const websocketStore = defineStore('websocket', () => {
	/**
	 * socket推送過來(lái)的全量數(shù)據(jù),暴露出去用戶對(duì)數(shù)據(jù)變更的監(jiān)聽
	 */
	const serviceMsg = ref({});
	

	/**
	 * 連接webSocket init
	 */
	const init = () => {
		createWebSocket(global_callback);
	};

	/**
	 * websocket的回調(diào)函數(shù)
	 * @param jsonMsg 表示收到的消息
	 */
	const global_callback = (jsonMsg) => {
		serviceMsg.value = jsonMsg;
		... ...
	};

	/**
	 * webSocket發(fā)送消息
	 * @param sendData 發(fā)送的json數(shù)據(jù)
	 */
	const send = (sendData) => {
		sendSock(JSON.stringify(sendData));
	};

	/**
	 * 關(guān)閉webSocket
	 */
	const close = ({ isActiveClose = false }) => {
		closeSock({ activeClose: isActiveClose });
	};

	/**
	 * 關(guān)閉后重啟socket
	 */
	const closeAndRestart = () => {
		close({ isActiveClose: true });
		init();
	};

    ... ...


	return {
		init,
		close,
		closeAndRestart,
		serviceMsg,
        ... ...
	};
});

4.頁(yè)面中使用文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-781109.html

// 在頁(yè)面掛載完成時(shí)啟動(dòng)websocket
onMounted(() => {
  websocketStore().init();
});

// 使用watch函數(shù)監(jiān)聽消息變更
watch(
		() => websocketStore().chatMsg,
		(nValue, oValue) => {
			// todo 界面信息更新
		}
);

到了這里,關(guān)于vue3:websocket的封裝與使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 前端vue3分享——項(xiàng)目封裝axios、vite使用env環(huán)境變量

    前端vue3分享——項(xiàng)目封裝axios、vite使用env環(huán)境變量

    大家好,我是yma16,本文分享關(guān)于前端vue3分享——項(xiàng)目封裝axios、使用env環(huán)境變量。 該系列往期文章: csdn新星計(jì)劃vue3+ts+antd賽道——利用inscode搭建vue3(ts)+antd前端模板 認(rèn)識(shí)vite_vue3 初始化項(xiàng)目到打包 什么是axios axios是一個(gè)流行的JavaScript庫(kù),用于在瀏覽器和Node.js環(huán)境中進(jìn)行H

    2024年02月07日
    瀏覽(177)
  • 基于Vue3封裝一個(gè)好用的Websocket

    在Vue3中使用Websocket可以讓我們輕松地實(shí)現(xiàn)實(shí)時(shí)數(shù)據(jù)傳輸。為了方便使用,我們可以封裝一個(gè)好用的Websocket類。 首先我們需要安裝 ws 庫(kù)來(lái)處理Websocket連接,使用以下命令進(jìn)行安裝: 我們可以新建一個(gè) websocket.js 文件,在其中定義一個(gè) Websocket 類,代碼如下: 以上代碼中,我們

    2024年02月04日
    瀏覽(19)
  • BMapGL -- 使用Class在 Vue3 ts 中封裝創(chuàng)建標(biāo)記和多邊形標(biāo)簽

    useSymbol.ts 文件 MarkerLabel 使用 PolygonLabel使用 這段代碼定義了兩個(gè)類:MarkerLabel 和 PolygonLabel,分別用于創(chuàng)建標(biāo)記和多邊形標(biāo)簽,并將它們添加到地圖上。 MarkerLabel 類接收一個(gè) markConfig 對(duì)象作為參數(shù),該對(duì)象包含創(chuàng)建標(biāo)記所需的各種配置信息,例如標(biāo)記的位置、標(biāo)記的樣式、標(biāo)

    2024年02月15日
    瀏覽(18)
  • 【vue3】前端應(yīng)用中使用WebSocket與服務(wù)器進(jìn)行通信并管理連接狀態(tài)。

    1、寫一個(gè)hook函數(shù) url 是WebSocket的服務(wù)器地址,其中 Math.random() 用于生成一個(gè)隨機(jī)數(shù),以避免緩存問題。 onConnected 、 onDisconnected 和 onError 是連接建立、斷開和出錯(cuò)時(shí)的回調(diào)函數(shù),你可以根據(jù)實(shí)際需求來(lái)定義它們。 onMessageDefault 是當(dāng)接收到消息時(shí)的默認(rèn)處理函數(shù),在這里將接收

    2024年02月09日
    瀏覽(46)
  • Vue3封裝全局WebSocket;全局可監(jiān)聽、可發(fā)送、心跳處理等;

    操作如下 可以在多個(gè)頁(yè)面多個(gè)組件中進(jìn)行監(jiān)聽/發(fā)送 代碼簡(jiǎn)介 方便; 首先安裝 tools-javascript 以及 tools-vue3 根據(jù)你的業(yè)務(wù)需求初始化 ws 在你的任何文件中直接調(diào)用即可 附加篇(也可不讀 直接看文檔 )

    2024年02月11日
    瀏覽(20)
  • ai問答:vue3+pinia+WebSocket 封裝斷線重連(實(shí)戰(zhàn))

    把 Socket 實(shí)例 掛載到全局 為方便梳理,請(qǐng)忽略 typescript ,一切盡在注釋中 Socket封裝(斷線重連) 這個(gè) WebSocket 類封裝了 WebSocket 的連接、重連、發(fā)送數(shù)據(jù)等方法。 在 connect 方法中,它會(huì)連接 WebSocket ,并綁定相關(guān)事件監(jiān)聽。 在 onclose 事件中,它會(huì)調(diào)用 reconnect 方法進(jìn)行重連。 recon

    2024年02月03日
    瀏覽(23)
  • 前端新手Vue3+Vite+Ts+Pinia+Sass項(xiàng)目指北系列文章 —— 第十一章 基礎(chǔ)界面開發(fā) (組件封裝和使用)

    前端新手Vue3+Vite+Ts+Pinia+Sass項(xiàng)目指北系列文章 —— 第十一章 基礎(chǔ)界面開發(fā) (組件封裝和使用)

    Vue 是前端開發(fā)中非常常見的一種框架,它的易用性和靈活性使得它成為了很多開發(fā)者的首選。而在 Vue2 版本中,組件的開發(fā)也變得非常簡(jiǎn)單,但隨著 Vue3 版本的發(fā)布,組件開發(fā)有了更多的特性和優(yōu)化,為我們的業(yè)務(wù)開發(fā)帶來(lái)了更多便利。本文將介紹如何使用 Vue3 開發(fā)業(yè)務(wù)組件

    2024年02月19日
    瀏覽(97)
  • Vue3創(chuàng)建項(xiàng)目(四)axios封裝及接口配置

    Vue3創(chuàng)建項(xiàng)目(四)axios封裝及接口配置

    項(xiàng)目結(jié)構(gòu):? 目錄 ???????index.ts ????????api.ts 看完需要預(yù)計(jì)花費(fèi)10分鐘。 請(qǐng)求攔截器與響應(yīng)攔截器? 閱讀下面代碼需先了解以下內(nèi)容: ? ? ????請(qǐng)求攔截器: ? ? 請(qǐng)求攔截器的作用是在請(qǐng)求發(fā)送前進(jìn)行一些操作,例如在每個(gè)請(qǐng)求體里加上token,每次請(qǐng)求攜帶token傳給

    2024年02月03日
    瀏覽(90)
  • 前端筆記之vue3 之 render函數(shù)和createVNode函數(shù)使用

    前端筆記之vue3 之 render函數(shù)和createVNode函數(shù)使用

    初學(xué)vue3的時(shí)候倒是扒了一點(diǎn)點(diǎn)源碼,似是而非,而且一直做的工作都是很簡(jiǎn)單的功能,怎么說(shuō)呢,ui框架也幾乎讓我很容易的就可以寫出一個(gè)成型的頁(yè)面,有時(shí)就忘了初學(xué)的時(shí)候的一些心得。 本內(nèi)容只說(shuō)createVNode函數(shù)的用法,不做源碼探究 效果圖: 雖然在日常中這么寫特別

    2024年02月07日
    瀏覽(27)
  • 前端實(shí)現(xiàn)簡(jiǎn)單的sse封裝(React hook Vue3)

    所謂的SSE(Sever-Sent Event),就是瀏覽器向服務(wù)器發(fā)送了一個(gè)HTTP請(qǐng)求,保持長(zhǎng)連接,服務(wù)器不斷單向地向?yàn)g覽器推送“信息”,這么做是為了節(jié)省網(wǎng)絡(luò)資源,不用一直發(fā)請(qǐng)求,建立新連接。 優(yōu)點(diǎn):SSE和WebSocket相比,最大的優(yōu)勢(shì)是便利,服務(wù)端不需要第三方組件,開發(fā)難度低,SSE和

    2024年02月09日
    瀏覽(33)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包