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

websocket斷線重連&&心跳檢測(cè)

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


前言

封裝websocket 實(shí)現(xiàn)斷線重連跟心態(tài)檢測(cè),使用的typeScript去封裝

一、服務(wù)端實(shí)現(xiàn)ws

在nodejs 安裝ws庫(kù)

1.引入庫(kù)

代碼如下(示例):

npm i ws

?服務(wù)端實(shí)現(xiàn)ws 創(chuàng)建一個(gè)server.js 文件 運(yùn)行ws服務(wù) ? node .\server.js?



// 引入模塊
const WebSocket = require("ws").Server;
const port = 3001;

// 創(chuàng)建服務(wù)器
const server = new WebSocket({ port }, () => {
  console.log("websocket服務(wù)開啟");
});

const connectHandler = (ws) => {
  console.log("客戶端連接");
  // 監(jiān)聽客戶端出錯(cuò)
  ws.on("error", errorHandler);
  // 監(jiān)聽客戶端斷開鏈接
  ws.on("close", closeHandler);
  // 監(jiān)聽客戶端發(fā)來(lái)的消息
  ws.on("message", messageHandler);
};

// 監(jiān)聽接收客戶端信息回調(diào)
// 注意:因?yàn)檫@里用到this的指向,因此用普通的函數(shù)
function messageHandler(data) {
  console.log("messageHandler===>接收客戶端消息", JSON.parse(data));
  const { ModeCode } = JSON.parse(data);
  switch (ModeCode) {
    case "message":
      console.log("收到消息");
      // 需要發(fā)送信息給客戶端以此說明連接成功
      this.send(JSON.stringify(JSON.parse(data)));
      break;
    case "heart_beat":
      console.log("心跳檢測(cè)");
      // 需要發(fā)送信息給客戶端以此說明連接成功
      this.send(JSON.stringify(JSON.parse(data)));
      break;
  }
}

// 監(jiān)聽客戶端出錯(cuò)回調(diào)
const errorHandler = (error) => {
  console.log("errorHandler===>客戶端出錯(cuò)", error);
};
// 監(jiān)聽客戶端斷開連接回調(diào)
const closeHandler = (e) => {
  console.log("closeHandler===>客戶端斷開??", e);
};

// 建立連接
server.on("connection", connectHandler);

客戶端實(shí)現(xiàn)websocket

創(chuàng)建一個(gè)socket.ts 文件

class Socket {
  wsUrl;
  constructor(wsUrl: any) {
    this.wsUrl = wsUrl;
  }

  ModeCode = {
    // websocket消息類型
    MSG: "message", // 普通消息
    HEART_BEAT: "heart_beat" // 心跳
  };
  ws: any = null;
  webSocketState: boolean = false; // webSocket的連接狀態(tài)
  heartBeat = {
    // 心跳連接的時(shí)間設(shè)置
    time: 5 * 1000, // 心跳時(shí)間間隔
    timeout: 3 * 1000, // timeout:心跳超時(shí)間隔
    reconnect: 10 * 1000 // 斷線重連時(shí)間
  };
  reconnectTimer: any = null; // 斷線重連時(shí)間器

  /**
   * 連接ws
   */
  connectWebSocket() {
    this.ws = new WebSocket(this.wsUrl);
    this.init();
  }
  /*
   * 心跳初始函數(shù)
   * @param time:心跳時(shí)間間隔
   */
  startHeartBeat(time: Number | string) {
    setTimeout(() => {
      this.ws.send(
        JSON.stringify({
          ModeCode: this.ModeCode.HEART_BEAT,
          msg: new Date()
        })
      );
      this.waitingServer();
    }, time as any);
  }
  // 延時(shí)等待服務(wù)端響應(yīng),通過webSocketState判斷是否連線成功
  waitingServer() {
    this.webSocketState = false;
    setTimeout(() => {
      if (this.webSocketState) {
        this.startHeartBeat(this.heartBeat.time);
        return;
      }
      console.log("心跳無(wú)響應(yīng),已斷線");
      try {
        this.ws.close();
      } catch (e) {
        console.log("連接已關(guān)閉,無(wú)需關(guān)閉");
      }
      this.reconnectWebSocket();
    }, this.heartBeat.timeout);
  }
  // 重連操作
  reconnectWebSocket() {
    this.reconnectTimer = setTimeout(() => {
      this.reconnectWs();
    }, this.heartBeat.reconnect);
  }
  //初始化
  init() {
    this.ws.addEventListener("open", () => {
      this.webSocketState = true; //socket狀態(tài)設(shè)置為連接,做為后面的斷線重連的攔截器
      this.heartBeat && this.heartBeat.time ? this.startHeartBeat(this.heartBeat.time) : ""; // 是否啟動(dòng)心跳機(jī)制
      console.log("開啟");
    });
    this.ws.addEventListener("message", (e: any) => {
      console.log(e.data, "eeeee");
      const data = JSON.parse(e.data);
      switch (data.ModeCode) {
        case this.ModeCode.MSG: // 普通消息
          console.log("收到消息" + data.msg);
          break;
        case this.ModeCode.HEART_BEAT: // 心跳
          this.webSocketState = true;
          console.log("收到心跳響應(yīng)" + data.msg);
          break;
      }
    });
    this.ws.addEventListener("close", (e: any) => {
      this.webSocketState = false; // socket狀態(tài)設(shè)置為斷線
      console.log("斷開了連接", e);
    });
    this.ws.addEventListener("error", (e: any) => {
      this.webSocketState = false; // socket狀態(tài)設(shè)置為斷線
      this.reconnectWebSocket(); // 重連
      console.log("連接發(fā)生了錯(cuò)誤", e);
    });
  }
  reconnectWs() {
    if (!this.ws) {
      // 第一次執(zhí)行,初始化
      this.connectWebSocket();
    }
    if (this.ws && this.reconnectTimer) {
      // 防止多個(gè)websocket同時(shí)執(zhí)行
      clearTimeout(this.reconnectTimer);
      this.ws.reconnectTimer = null;
      this.connectWebSocket();
    }
  }

  //發(fā)送數(shù)據(jù)
  sendMessage(data: any) {
    this.ws.send(JSON.stringify(data));
  }
  //在其他需要socket地方主動(dòng)關(guān)閉socket
  closeWebSocket(e: any) {
    console.log(e);
    this.ws.close();
    clearTimeout(this.reconnectTimer);
    this.webSocketState = false;
  }
}

export default Socket;

vue 頁(yè)面使用

//引用
import Scoket from "@/utils/socket";

const socket = new Scoket("ws://localhost:3001");
//發(fā)送消息
const onSend = () => {
  console.log("onSend");
  socket.sendMessage(message.value);
};
//連接ws
onMounted(() => {
  socket.connectWebSocket();
});

websocket判斷客戶端斷開,websocket,網(wǎng)絡(luò)協(xié)議,網(wǎng)絡(luò)

斷開ws服務(wù) 斷線? 啟動(dòng)服務(wù)后 自動(dòng)重連文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-805037.html


到了這里,關(guān)于websocket斷線重連&&心跳檢測(cè)的文章就介紹完了。如果您還想了解更多內(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)文章

  • uniapp使用WebSocket斷線,心跳重連機(jī)制

    提示:我們?cè)谑褂肳ebSocket,經(jīng)常會(huì)遇到有的時(shí)候給別人發(fā)消息,別人會(huì)接收不到,這個(gè)時(shí)候就有可能是WebSocket斷線了,所以這個(gè)時(shí)候心跳包就出現(xiàn)了 提示:可直接使用,記得把對(duì)應(yīng)地址替換一下

    2024年04月12日
    瀏覽(31)
  • SpringBoot+Netty實(shí)現(xiàn)TCP客戶端實(shí)現(xiàn)接收數(shù)據(jù)按照16進(jìn)制解析并存儲(chǔ)到Mysql以及Netty斷線重連檢測(cè)與自動(dòng)重連

    SpringBoot+Netty實(shí)現(xiàn)TCP客戶端實(shí)現(xiàn)接收數(shù)據(jù)按照16進(jìn)制解析并存儲(chǔ)到Mysql以及Netty斷線重連檢測(cè)與自動(dòng)重連

    在SpringBoot項(xiàng)目中需要對(duì)接三方系統(tǒng),對(duì)接協(xié)議是TCP,需實(shí)現(xiàn)一個(gè)TCP客戶端接收 服務(wù)端發(fā)送的數(shù)據(jù)并按照16進(jìn)制進(jìn)行解析數(shù)據(jù),然后對(duì)數(shù)據(jù)進(jìn)行過濾,將指定類型的數(shù)據(jù) 通過mybatis存儲(chǔ)進(jìn)mysql數(shù)據(jù)庫(kù)中。并且當(dāng)tcp服務(wù)端斷連時(shí),tcp客戶端能定時(shí)檢測(cè)并發(fā)起重連。 全流程效果 ?

    2024年02月03日
    瀏覽(18)
  • java webSocket服務(wù)端、客戶端、心跳檢測(cè)優(yōu)雅解決

    項(xiàng)目分為三個(gè)端,項(xiàng)目之間需要webSocket通信。 WebSocketConfig WebSocketServer

    2024年02月17日
    瀏覽(19)
  • websocket實(shí)時(shí)通訊和socket.io實(shí)時(shí)通信庫(kù)的使用;心跳機(jī)制與斷線重連

    https://zh.javascript.info/websocket WebSocket 是一種網(wǎng)絡(luò)通信協(xié)議,就類似于 HTTP 也是一種通信協(xié)議。 為什么需要 WebSocket? 因?yàn)?HTTP 協(xié)議有一個(gè)缺陷:通信只能由客戶端發(fā)起。 代碼解析: 創(chuàng)建WebSocket實(shí)例:通過 new WebSocket() 創(chuàng)建一個(gè)WebSocket實(shí)例。在括號(hào)中傳入服務(wù)器的URL,該URL指定了

    2024年02月16日
    瀏覽(39)
  • C++ Qt TCP的心跳檢測(cè)機(jī)制,斷線重連技術(shù),應(yīng)用層代碼重新實(shí)現(xiàn)

    C++ Qt TCP的心跳檢測(cè)機(jī)制,斷線重連技術(shù),應(yīng)用層代碼重新實(shí)現(xiàn)

    目錄 前言: 一、Qt直接啟動(dòng)本身的KeepAlive 二、在應(yīng)用層自己實(shí)現(xiàn)一個(gè)心跳檢測(cè) ?三、自定義心跳代碼實(shí)現(xiàn): 完整客戶端服務(wù)端工程下載: 共用的結(jié)構(gòu)體相關(guān)頭文件: ? ? ? ? 客戶端部分核心代碼: ? ? ? ? 服務(wù)端部分核心代碼: 運(yùn)行結(jié)果展示: 前兩篇關(guān)于qt tcp 相關(guān)的,

    2024年02月05日
    瀏覽(22)
  • websocket超時(shí)重連、心跳檢測(cè)

    在單個(gè)TCP連接上進(jìn)行全雙工通信的協(xié)議,可以實(shí)現(xiàn)服務(wù)端和客戶端雙向推送信息的協(xié)議。我們?cè)谑褂脀ebscoket通信時(shí)必須要注意的問題超時(shí)重連和心跳檢測(cè)。 超時(shí)重連:當(dāng)出現(xiàn)錯(cuò)誤時(shí)客戶端嘗試重新連接websocket。 心跳檢測(cè):客戶端長(zhǎng)時(shí)間沒接收到服務(wù)端消息,就向服務(wù)端發(fā)送

    2024年02月11日
    瀏覽(21)
  • WebSocket心跳檢測(cè)和重連機(jī)制

    心跳和重連的目的用一句話概括就是客戶端和服務(wù)端保證彼此還活著,避免丟包發(fā)生。 websocket 連接斷開有以下兩證情況: 前端斷開 在使用 websocket 過程中,可能會(huì)出現(xiàn)網(wǎng)絡(luò)斷開的情況,比如信號(hào)不好,或者網(wǎng)絡(luò)臨時(shí)關(guān)閉,這時(shí)候websocket的連接已經(jīng)斷開,而不同瀏覽器有不同

    2024年01月21日
    瀏覽(33)
  • Vue 2 中 WebSocket 模塊實(shí)現(xiàn)與應(yīng)用(包含心跳檢測(cè)、自動(dòng)重連)

    Vue 2 中 WebSocket 模塊實(shí)現(xiàn)與應(yīng)用(包含心跳檢測(cè)、自動(dòng)重連)

    WebSocket 技術(shù)是一種在 Web 開發(fā)中常用的實(shí)時(shí)通信方式,它允許客戶端和服務(wù)器之間建立持久性的雙向連接,以便實(shí)時(shí)地傳輸數(shù)據(jù)。在 Vue.js 項(xiàng)目中,使用 WebSocket 可以輕松實(shí)現(xiàn)實(shí)時(shí)消息推送、即時(shí)通訊等功能。在這篇博客中,我們將介紹一個(gè)基于 Vue.js 的 WebSocket 模塊的實(shí)現(xiàn),

    2024年02月03日
    瀏覽(54)
  • Unity-TCP-網(wǎng)絡(luò)聊天功能(四): 消息粘包、心跳機(jī)制保活(心跳包)、斷線重連

    Unity-TCP-網(wǎng)絡(luò)聊天功能(四): 消息粘包、心跳機(jī)制?;?心跳包)、斷線重連

    bug1:下線后,如果發(fā)送多條消息,在客戶端上線時(shí),一瞬間接收到,效果如同粘包,需要拆包。舉例,連續(xù)發(fā)送三條160長(zhǎng)度消息,可能實(shí)際顯示2條消息,原因,第三條消息和第二條消息粘包,第二條消息長(zhǎng)度變?yōu)?20,但是Receive方法沒有考慮這個(gè)問題,相當(dāng)于這段代碼只運(yùn)行

    2024年02月11日
    瀏覽(20)
  • uniapp websocket 封裝斷線重連

    uniapp websocket 封裝斷線重連

    ?1.新建一個(gè)工具類js文件 2. 把我封裝的代碼復(fù)制進(jìn)去 我是用uniapp 的api封裝的 在外面也可以直接用uniapp的api操作 只有在開始調(diào)用連接需要用封裝的方法調(diào)用 在需要使用封裝的方法的頁(yè)面?引入js ?? ?import { ?? ??? ?websocetObj ?? ?} from \\\"@/API/websocket.js\\\" ?完善重連 在app.vue的

    2024年02月11日
    瀏覽(17)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包