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

vue封裝和使用websocket

這篇具有很好參考價值的文章主要介紹了vue封裝和使用websocket。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前言

最近做了一個數(shù)據(jù)大屏的項目,使用了websocket來實現(xiàn)數(shù)據(jù)實時更新的需求,簡單記錄分享一下。

什么是websocket?

1、WebSocket協(xié)議是基于TCP的一種新的網(wǎng)絡(luò)協(xié)議,允許服務(wù)端主動向客戶端推送數(shù)據(jù),實現(xiàn)全雙工通信。
2、在WebSocket API中,瀏覽器和服務(wù)器只需要完成一次握手,兩者之間就直接可以創(chuàng)建持久性的連接,并進行雙向數(shù)據(jù)傳輸。

1、封裝websocket代碼

websocket的請求地址是以‘ws:// ’或 ‘wss:// ’開頭的。

// websocket實例
let wsObj = null;
// ws連接地址
let wsUrl = null;
// let userId = null;
// 是否執(zhí)行重連 true/不執(zhí)行 ; false/執(zhí)行
let lockReconnect = false;
// 重連定時器
let wsCreateHandler = null;
// 連接成功,執(zhí)行回調(diào)函數(shù)
let messageCallback = null;
// 連接失敗,執(zhí)行回調(diào)函數(shù)
let errorCallback = null;
// 發(fā)送給后臺的數(shù)據(jù)
let sendDatas = {};

/**
 * 發(fā)起websocket請求函數(shù)
 * @param {string} url ws連接地址
 * @param {Object} agentData 傳給后臺的參數(shù)
 * @param {function} successCallback 接收到ws數(shù)據(jù),對數(shù)據(jù)進行處理的回調(diào)函數(shù)
 * @param {function} errCallback ws連接錯誤的回調(diào)函數(shù)
 */
export const connectWebsocket = (
  url,
  agentData,
  successCallback,
  errCallback
) => {
  wsUrl = url;
  createWebSoket();
  messageCallback = successCallback;
  errorCallback = errCallback;
  sendDatas = agentData;
  console.log(sendDatas);
};

// 手動關(guān)閉websocket (這里手動關(guān)閉會執(zhí)行onclose事件)
export const closeWebsocket = () => {
  if (wsObj) {
    writeToScreen("手動關(guān)閉websocket");
    wsObj.close(); // 關(guān)閉websocket
    // wsObj.onclose() // 關(guān)閉websocket(如果上面的關(guān)閉不生效就加上這一條)
    // 關(guān)閉重連
    lockReconnect = true;
    wsCreateHandler && clearTimeout(wsCreateHandler);
    // 關(guān)閉心跳檢查
    heartCheck.stop();
  }
};

// 創(chuàng)建ws函數(shù)
const createWebSoket = () => {
  if (typeof WebSocket === "undefined") {
    writeToScreen("您的瀏覽器不支持WebSocket,無法獲取數(shù)據(jù)");
    return false;
  }
  // wsUrl = "ws://" + host + "/websoket" + userId;
  // your_params:你要傳給后端的參數(shù)
  try {
    wsObj = new WebSocket(wsUrl, your_params);
    initWsEventHandle();
  } catch (e) {
    writeToScreen("連接異常,開始重連");
    reconnect();
  }
};

const initWsEventHandle = () => {
  try {
    // 連接成功
    wsObj.onopen = (event) => {
      console.log("連接成功");
      onWsOpen(event);
      heartCheck.start();
    };

    // 監(jiān)聽服務(wù)器端返回的信息
    wsObj.onmessage = (event) => {
      console.log("監(jiān)聽服務(wù)器端返回的信息");
      onWsMessage(event);
      heartCheck.start();
    };

    wsObj.onclose = (event) => {
      writeToScreen("onclose執(zhí)行關(guān)閉事件");
      onWsClose(event);
    };

    wsObj.onerror = (event) => {
      writeToScreen("onerror執(zhí)行error事件,開始重連");
      onWsError(event);
      reconnect();
    };
  } catch (err) {
    writeToScreen("綁定事件沒有成功,開始重連");
    reconnect();
  }
};

const onWsOpen = (event) => {
  writeToScreen("CONNECT");
  // // 客戶端與服務(wù)器端通信
  // wsObj.send('我發(fā)送消息給服務(wù)端');
  // 添加狀態(tài)判斷,當為OPEN時,發(fā)送消息
  if (wsObj.readyState === wsObj.OPEN) {
    // wsObj.OPEN = 1
    // 發(fā)給后端的數(shù)據(jù)需要字符串化
    wsObj.send(JSON.stringify(sendDatas));
  }
  if (wsObj.readyState === wsObj.CLOSED) {
    // wsObj.CLOSED = 3
    writeToScreen("wsObj.readyState=3, ws連接異常,開始重連");
    reconnect();
    errorCallback();
  }
};
const onWsMessage = (event) => {
  const jsonStr = event.data;
  writeToScreen("onWsMessage接收到服務(wù)器的數(shù)據(jù): ", jsonStr);
  messageCallback(jsonStr);
};
const onWsClose = (event) => {
  writeToScreen("DISCONNECT");
  // e.code === 1000  表示正常關(guān)閉。 無論為何目的而創(chuàng)建, 該鏈接都已成功完成任務(wù)。
  // e.code !== 1000  表示非正常關(guān)閉。
  console.log("onclose event: ", event);
  if (event && event.code !== 1000) {
    writeToScreen("非正常關(guān)閉");
    errorCallback();
    // 如果不是手動關(guān)閉,這里的重連會執(zhí)行;如果調(diào)用了手動關(guān)閉函數(shù),這里重連不會執(zhí)行
    reconnect();
  }
};
const onWsError = (event) => {
  writeToScreen("onWsError: ", event.data);
  errorCallback();
};

const writeToScreen = (massage) => {
  console.log(massage);
};

// 重連函數(shù)
const reconnect = () => {
  if (lockReconnect) {
    return;
  }
  writeToScreen("3秒后重連");
  lockReconnect = true;
  // 沒連接上會一直重連,設(shè)置延遲避免請求過多
  wsCreateHandler && clearTimeout(wsCreateHandler);
  wsCreateHandler = setTimeout(() => {
    writeToScreen("重連..." + wsUrl);
    createWebSoket();
    lockReconnect = false;
    writeToScreen("重連完成");
  }, 3000);
};

// 從瀏覽器地址中獲取對應(yīng)參數(shù)
const GetQueryString = (name) => {
  let reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
  // 獲取url中 ? 符后的字符串并正則匹配
  let r = window.location.search.substr(1).match(reg);
  let context = "";
  r && (context = r[2]);
  reg = null;
  r = null;
  return context;
};

// 心跳檢查(看看websocket是否還在正常連接中)
let heartCheck = {
  timeout: 15000,
  timeoutObj: null,
  serverTimeoutObj: null,
  // 重啟
  reset() {
    clearTimeout(this.timeoutObj);
    clearTimeout(this.serverTimeoutObj);
    this.start();
  },
  // 停止
  stop() {
    clearTimeout(this.timeoutObj);
    clearTimeout(this.serverTimeoutObj);
  },
  // 開啟定時器
  start() {
    this.timeoutObj && clearTimeout(this.timeoutObj);
    this.serverTimeoutObj && clearTimeout(this.serverTimeoutObj);
    // 15s之內(nèi)如果沒有收到后臺的消息,則認為是連接斷開了,需要重連
    this.timeoutObj = setTimeout(() => {
      writeToScreen("心跳檢查,發(fā)送ping到后臺");
      try {
        const sendData = { active: "heart" };
        wsObj.send(JSON.stringify(sendData));
      } catch (err) {
        writeToScreen("發(fā)送ping異常");
      }
      console.log("內(nèi)嵌定時器this.serverTimeoutObj: ", this.serverTimeoutObj);
      // 內(nèi)嵌定時器
      this.serverTimeoutObj = setTimeout(() => {
        writeToScreen("沒有收到后臺的數(shù)據(jù),重新連接");
        reconnect();
      }, this.timeout);
    }, this.timeout);
  },
};

2、頁面使用:

先引入:

import { connectWebsocket, closeWebsocket } from "@/utils/websocket.js";

這是一個數(shù)據(jù)大屏的項目因為只有一個頁面,我就把建立鏈接的方法放在了首頁的mounted里面,你們可以放到main.js。

mounted() {
    connectWebsocket(
      // 地址
      "ws://后端提供的地址",
      // 傳遞給后臺的數(shù)據(jù)
      {},
      // 成功拿到后臺返回的數(shù)據(jù)的回調(diào)函數(shù)
      (res) => {
        let datas = JSON.parse(res); 
        let result = datas.data.data;
 		console.log(result,'返回結(jié)果,拿到之后該干啥干啥吧!')
      },
      // websocket連接失敗的回調(diào)函數(shù)
      () => {
        console.log("失敗的回調(diào)函數(shù)");
      }
    );
  },

http://t.csdn.cn/fiAsF文章來源地址http://www.zghlxwxcb.cn/news/detail-741211.html

到了這里,關(guān)于vue封裝和使用websocket的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • vue2 封裝 webSocket 開箱即用

    vue2 封裝 webSocket 開箱即用

    第一步: ? ?下載 webSocket? 第二步: ? 需要在 main.js 中 引入 ?第三步: ? ? 封裝相關(guān)的連接和斷開 ? ?相關(guān)代碼?。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。?! ?第四步:? 引入使用 到這步接收信息已經(jīng)OK了(記得和后端配合) ? ?使用

    2024年02月14日
    瀏覽(19)
  • 基于Vue3封裝一個好用的Websocket

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

    2024年02月04日
    瀏覽(19)
  • 在vue項目中webSocket封裝(傳token)

    ????????在websocket中,目前未提供修改請求頭字段的方法,參考其他的一些文章,依照他們的寫法依然未能實現(xiàn)傳遞token,所有我和后端另辟蹊徑,把token傳在路徑里面。 ? ? ? ? 這樣寫就可以長久的建立鏈接。

    2024年04月29日
    瀏覽(13)
  • vue3+nodejs(websocket)實現(xiàn)監(jiān)控拉rtsp流,使用flv.js+ffmpeg包(主要建立websocket是為了轉(zhuǎn)碼傳流)

    vue3+nodejs(websocket)實現(xiàn)監(jiān)控拉rtsp流,使用flv.js+ffmpeg包(主要建立websocket是為了轉(zhuǎn)碼傳流)

    關(guān)于拉取監(jiān)控攝像頭的流,我個人去查了很多資料,也是因為之前沒有接觸過這一模塊,加上目前公司也沒有后端去寫接口,所以我直接用node去寫websocket,與前端建立起通信,能夠進行后續(xù)轉(zhuǎn)碼、傳流,能夠?qū)崿F(xiàn)實時播放監(jiān)控畫面。 這里的rtsp流是要事先知道的,監(jiān)控的這個

    2024年02月20日
    瀏覽(25)
  • vue2 封裝 webSocket 開箱即用(或 uni.connectSocket)

    vue2 封裝 webSocket 開箱即用(或 uni.connectSocket)

    第一步: ? ?下載 webSocket? 第二步: ? 需要在 main.js 中 引入 ?第三步: ? ? 封裝相關(guān)的連接和斷開 ? ?相關(guān)代碼?。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。?! ?第四步:? 引入使用 到這步接收信息已經(jīng)OK了(記得和后端配合) ? ?使用

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

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

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

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

    2024年02月03日
    瀏覽(23)
  • 使用JavaScript和Vue.js框架開發(fā)的電子商務(wù)網(wǎng)站,實現(xiàn)商品展示和購物車功能

    引言: 隨著互聯(lián)網(wǎng)的快速發(fā)展和智能手機的普及,電子商務(wù)行業(yè)正迎來一個全新的時代。越來越多的消費者選擇網(wǎng)上購物,而不再局限于傳統(tǒng)的實體店。這種趨勢不僅僅是改變了消費者的習(xí)慣購物,也給企業(yè)帶來了巨大的商機。為了不斷滿足消費者的需求,電子商務(wù)網(wǎng)站需要

    2024年02月15日
    瀏覽(26)
  • uniapp websocket的使用和封裝

    uniapp websocket的使用和封裝

    在uniapp中socket分為兩種形式,第一種適用于只有一個socket鏈接,第二種適用于多個socket鏈接。傳送門 這里以socketTask為列子封裝 在utils新建一個文件 在你要使用的頁面引入,我這是聊天那種,所以我在拿到用戶信息之后連接socket。 直接上源碼 我這里是找了其他人的,然后改

    2024年02月19日
    瀏覽(20)
  • Websocket的基本認識、使用與封裝

    目錄 一、Websocket是什么 二、Websocket的基本使用 使用介紹 第一步 第二步 第三步 第四步 常用API介紹? WebSocket(url[, protocols]) WebSocket.readyState ?WebSocket.send(data) WebSocket.close([code[, reason]]) WebSocket.bufferedAmount WebSocket.extensions WebSocket.binaryType 三、Websocket的封裝 vue代碼 react代碼 ????

    2024年02月03日
    瀏覽(17)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包