亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

如何使用vue3簡(jiǎn)單實(shí)現(xiàn)WebSocket通信

 更新時(shí)間:2023年08月22日 09:33:39   作者:前端爆炸蟲(chóng)  
這篇文章主要給大家介紹了關(guān)于如何使用vue3簡(jiǎn)單實(shí)現(xiàn)WebSocket通信的相關(guān)資料,WebSocket是全雙工網(wǎng)絡(luò)通信通信協(xié)議,實(shí)現(xiàn)了客戶端和服務(wù)器的平等對(duì)話,任何一方都可以主動(dòng)發(fā)送數(shù)據(jù),需要的朋友可以參考下

前言

WebSocket是一種在客戶端和服務(wù)器之間進(jìn)行雙向通信的網(wǎng)絡(luò)協(xié)議。它通過(guò)建立持久性的、全雙工的連接,允許服務(wù)器主動(dòng)向客戶端發(fā)送數(shù)據(jù),而不需要客戶端顯式地發(fā)送請(qǐng)求。

關(guān)于WebSocket通信的簡(jiǎn)單介紹:

  • 握手階段:在建立WebSocket連接之前,客戶端需要發(fā)送一個(gè)HTTP請(qǐng)求到服務(wù)器,請(qǐng)求升級(jí)為WebSocket協(xié)議。這個(gè)過(guò)程稱為握手(Handshake)。如果服務(wù)器支持WebSocket協(xié)議,它將返回帶有特定標(biāo)頭的HTTP響應(yīng),表示握手成功。
  • 建立連接:客戶端收到服務(wù)器的握手響應(yīng)后,會(huì)重新建立連接。此時(shí),連接將從HTTP協(xié)議切換到WebSocket協(xié)議,并保持打開(kāi)狀態(tài)。這樣就建立了可持續(xù)的雙向通信通道。
  • 數(shù)據(jù)傳輸:一旦WebSocket連接建立,客戶端和服務(wù)器可以開(kāi)始互相發(fā)送消息。客戶端和服務(wù)器都可以通過(guò)發(fā)送文本或二進(jìn)制數(shù)據(jù)來(lái)通信。消息可以是簡(jiǎn)單的字符串,也可以是復(fù)雜的數(shù)據(jù)結(jié)構(gòu),如JSON對(duì)象等。
  • 斷開(kāi)連接:當(dāng)需要關(guān)閉WebSocket連接時(shí),客戶端或服務(wù)器可以主動(dòng)發(fā)送一個(gè)關(guān)閉幀來(lái)斷開(kāi)連接。收到關(guān)閉幀的一方會(huì)結(jié)束連接并發(fā)送回應(yīng)幀,完成連接的關(guān)閉。

WebSocket通信具有以下特點(diǎn):

  • 實(shí)時(shí)性:由于WebSocket使用長(zhǎng)連接,可以實(shí)時(shí)地將數(shù)據(jù)推送到客戶端,而不需要顯式地發(fā)送請(qǐng)求。這使得它非常適合需要快速、實(shí)時(shí)響應(yīng)的應(yīng)用程序。
  • 雙向通信:WebSocket允許客戶端和服務(wù)器之間雙向傳輸消息。這意味著服務(wù)器可以主動(dòng)向客戶端推送數(shù)據(jù),而不僅限于響應(yīng)客戶端的請(qǐng)求。
  • 較低的開(kāi)銷:相比于傳統(tǒng)的輪詢方式(每隔一段時(shí)間發(fā)送請(qǐng)求),WebSocket連接具有較低的開(kāi)銷。一旦建立連接,它只需要發(fā)送少量的數(shù)據(jù)頭部信息,并且在保持連接時(shí)可以重復(fù)使用該連接。
  • 跨平臺(tái)支持:WebSocket協(xié)議是一種標(biāo)準(zhǔn)化的協(xié)議,被廣泛支持和應(yīng)用于不同的平臺(tái)和編程語(yǔ)言中。

通過(guò)使用WebSocket,開(kāi)發(fā)人員可以實(shí)現(xiàn)實(shí)時(shí)通信、聊天應(yīng)用、多人游戲、股票行情等需要及時(shí)交互和更新的應(yīng)用程序。

相關(guān)代碼如下:

①創(chuàng)建src/utils/websocket.ts文件

import { ElMessage } from 'element-plus'
import store from '../store'
let websocket: WebSocket | null = null; // 用于存儲(chǔ)實(shí)例化后websocket
let rec: any; // 斷線重連后,延遲5秒重新創(chuàng)建WebSocket連接  rec用來(lái)存儲(chǔ)延遲請(qǐng)求的代碼
// 創(chuàng)建websocket
function creatWebSocket(wsUrl: string) {
  console.log("websocket==================");
  // 判斷當(dāng)前瀏覽器是否支持WebSocket
  if ("WebSocket" in window) {
    console.log("當(dāng)前瀏覽器支持 WebSocket");
  } else if ("MozWebSocket" in window) {
    console.log("當(dāng)前瀏覽器支持 MozWebSocket");
  } else {
    console.log("當(dāng)前瀏覽器不支持 WebSocket");
  }
  try {
    initWebSocket(wsUrl); // 初始化websocket連接
  } catch (e) {
    console.log("嘗試創(chuàng)建連接失敗");
    reConnect(wsUrl); // 如果無(wú)法連接上 webSocket 那么重新連接!可能會(huì)因?yàn)榉?wù)器重新部署,或者短暫斷網(wǎng)等導(dǎo)致無(wú)法創(chuàng)建連接
  }
}
// 初始化websocket
function initWebSocket(wsUrl: string) {
  websocket = new WebSocket(wsUrl);
  console.log("websocket:", websocket);
  websocket.onopen = function () {
    websocketOpen();
  };
  //   // 接收
  websocket.onmessage = function (e: MessageEvent<any>) {
    websocketonmessage(e);
  };
  // 連接發(fā)生錯(cuò)誤
  websocket.onerror = function () {
    console.log("WebSocket連接發(fā)生錯(cuò)誤");
    //     isConnect = false; // 連接斷開(kāi)修改標(biāo)識(shí)
    reConnect(wsUrl); // 連接錯(cuò)誤 需要重連
  };
  websocket.onclose = function (e) {
    websocketclose(e);
  };
}
// 定義重連函數(shù)
let reConnect = (wsUrl: string) => {
  console.log("嘗試重新連接");
  if (store.state.isConnected) return; // 如果已經(jīng)連上就不在重連了
  rec && clearTimeout(rec);
  rec = setTimeout(function () {
    // 延遲5秒重連  避免過(guò)多次過(guò)頻繁請(qǐng)求重連
    creatWebSocket(wsUrl);
  }, 5000);
};
// 創(chuàng)建連接
function websocketOpen() {
  console.log("連接成功");
  store.dispatch('connect'); // 修改連接狀態(tài)
}
// 數(shù)據(jù)接收
function websocketonmessage(e: MessageEvent<any>) {
  console.log("數(shù)據(jù)接收", e.data);
  const data = JSON.parse(e.data);  // 解析JSON格式的數(shù)據(jù)
  // 下面的判斷則是后臺(tái)返回的接收到的數(shù)據(jù)  如何處理自己決定
  if (data.code === 400) {
    console.log("數(shù)據(jù)接收", data.msg);
    ElMessage({
      showClose: true,
      message: data.msg,
      type: 'warning',
    })
  } else if (data.code === 404) {
    ElMessage({
      showClose: true,
      message: data.msg,
      type: 'warning',
    })
  } else if (data.code === 0) {
    ElMessage({
      showClose: true,
      message: "連接成功",
      type: 'success',
    })
  } else if (data.code === 200) {
    ElMessage({
      showClose: true,
      message: data.msg,
      type: 'success',
    })
    // 成功后的相應(yīng)處理  此處成功后播放音樂(lè)
    const audio = new Audio('./tipMusic.mp3');
    audio.play();
  } else {
    ElMessage({
      showClose: true,
      message: data.msg,
      type: 'error',
    })
    // 延時(shí)5秒后刷新頁(yè)面
    setTimeout(() => {
      location.reload();
    }, 1000);
  }
  // let data = JSON.parse(decodeUnicode(e.data))
}
// 關(guān)閉
function websocketclose(e: any) {
  console.log(e);
  store.dispatch('disconnect'); // 修改連接狀態(tài)
  console.log("connection closed (" + e.code + ")");
}
// 數(shù)據(jù)發(fā)送
function websocketsend(data: any) {
  console.log("發(fā)送的數(shù)據(jù)", data, JSON.stringify(data));
  if (websocket && store.state.isConnected) { // 檢查連接狀態(tài)
    websocket.send(JSON.stringify(data));
  } else {
    ElMessage({
      showClose: true,
      message: "請(qǐng)選擇設(shè)備連接",
      type: 'error',
    })
  }
}
// 實(shí)際調(diào)用的方法==============
// 發(fā)送
function sendWebSocket(data: any) {
  // 如果未保持連接狀態(tài) 不允許直接發(fā)送消息 提示請(qǐng)選擇連接設(shè)備
  if (!store.state.isConnected) {
    ElMessage({
      showClose: true,
      message: "請(qǐng)選擇設(shè)備連接",
      type: 'error',
    })
  } else {
    websocketsend(data);
    console.log("------------------");
  }
}
// 關(guān)閉
let closeWebSocket = () => {
  if (websocket) {
    websocket.close();
    ElMessage({
      showClose: true,
      message: "設(shè)備已關(guān)閉",
      type: 'success',
    })
  }
};
export {
  initWebSocket,
  sendWebSocket,
  creatWebSocket,
  closeWebSocket,
};

②全局保存連接狀態(tài)src/store/index.ts

先安裝npm install vuex

import { createStore } from 'vuex'
const store = createStore({
  state: {
    isConnected: false,//連接狀態(tài)
  },
  mutations: {
    setConnected(state: any, isConnected: boolean) {
      state.isConnected = isConnected
    },
  },
  actions: {
    connect({ commit }: { commit: any }) {
      // 連接成功后,將 isConnected 狀態(tài)設(shè)置為 true
      commit('setConnected', true)
    },
    disconnect({ commit }: { commit: any }) {
      // 斷開(kāi)連接或退出登錄時(shí),將 isConnected 狀態(tài)設(shè)置為 false
      commit('setConnected', false)
    }
  }
})
export default store

③頁(yè)面連接設(shè)備

<script setup lang="ts">
import { ref ,onMounted} from 'vue'
import { closeWebSocket,initWebSocket } from '../../utils/websocket'
import { useStore } from 'vuex';
const store = useStore()
//連接設(shè)備  (具體路徑和后端規(guī)定)
function connectMsg() {
  const toIp = `ws://192.168.50.50:8822/websocket/ipad/${roomId.value}`;
  store.dispatch('connect')
  initWebSocket(toIp)
}
// 設(shè)備斷開(kāi)
function closeWs() {
  closeWebSocket()
  store.dispatch('disconnect')
}
</script>
<template>
<div class="connect">
? ? ? ? ? <el-button class="elbtn" @click="connectMsg">連接設(shè)備</el-button>
? ? ? ? <el-button class="elbtn" @click="closeWs">關(guān)閉設(shè)備</el-button>
? ? ? ? </div>
</template>

④發(fā)送消息給后端

<script setup lang="ts">
import {ref} from 'vue'
import { sendWebSocket } from '../../utils/websocket'
const courseTopic = ref('')
const courseGrowth = ref('')
const todayHaul = ref('')
const selectedTeacher = ref('')
//提交
const harvestSubmit = () => {
? // 要發(fā)送的數(shù)據(jù)? 和后端定義格式
? const harvestData = {
? ? "HandlerType": "COURSEREFLECT",
? ? "topicReflect": courseTopic.value,
? ? "growReflect": courseGrowth.value,
? ? "harvest": todayHaul.value,
? ? "teacher": "李老師"
}
? ? console.log("提交反思與收獲數(shù)據(jù)",harvestData);?
? // 發(fā)送消息給后端
? ? sendWebSocket(harvestData)
? }
</script>
<template>
? ? ? ? <div class="think">
? ? ? ? ? <p>課程反思</p>
? ? ? ? <el-input v-model="courseTopic" :rows="3" type="textarea" placeholder="主題課程" />
? ? ? ? <el-input v-model="courseGrowth" :rows="3" type="textarea" placeholder="適性成長(zhǎng)課程" />
? ? ? ? <p>今日收獲</p>
? ? ? ? <el-input v-model="todayHaul" :rows="3" type="textarea" ?/>
? ? ? ? </div>
? ? ? ? <div class="btn">
? ? ? ? ? ? <button @click="harvestSubmit"> 提交</button>
? ? ? ? ? </div>
? ? </template>

總結(jié)

到此這篇關(guān)于如何使用vue3簡(jiǎn)單實(shí)現(xiàn)WebSocket通信的文章就介紹到這了,更多相關(guān)vue3實(shí)現(xiàn)WebSocket通信內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論