H5即時通訊Websocket

来源:https://www.cnblogs.com/webSciprt/archive/2018/01/20/8319918.html
-Advertisement-
Play Games

/** * Created by admin on 2017/8/19. */ // import Vue from 'vue' // import axios from './HTTP.js' // Vue.use(axios) import * as DB from './DBDATA.js' ... ...


/**
 * Created by admin on 2017/8/19.
 */
// import Vue from 'vue'
// import axios from './HTTP.js'
// Vue.use(axios)
import * as DB from './DBDATA.js'
// import qs from 'qs'
const WebSocketMsg = function (_self, url) {
  let obj = {}
  obj.infoData = DB.INFO_DATA
  obj.ws = null
  obj.lockReconnect = false   // 避免重覆連接
  // obj.wsUrl = 'ws://192.168.1.90:8080/service-jcj/websocket'   // 通訊地址
  obj.createWebSocket = function () {      // 通訊開啟事件
    try {
      obj.ws = new WebSocket(url)
      obj.initEventHandle()
    } catch (e) {
      obj.reconnect(url)
    }
  }

  obj.initEventHandle = function () {     // 通訊操作事件   開啟 消息 關閉 錯誤
    obj.ws.onclose = function () {
      obj.reconnect(url)      // 通訊重連
      console.log('通訊關閉')
    }
    obj.ws.onerror = function () {
      obj.reconnect(url)       // 通訊重連
      console.log('通訊錯誤')
    }
    obj.ws.onopen = function () {
      // 心跳檢測重置
      obj.heartCheck.reset()      // 心跳檢測重置
      obj.heartCheck.start()      // 心跳檢測開啟
      console.log('通訊開啟')
    }
    obj.ws.onmessage = function (event) {
      // 如果獲取到消息,心跳檢測重置
      // 拿到任何消息都說明當前連接是正常的
      obj.heartCheck.reset()      // 心跳檢測重置
      obj.heartCheck.start()      // 心跳檢測開啟
      console.log('通訊消息')
      console.log(event)
    }
  }
  obj.reconnect = function () {        // 通訊重連
    if (obj.lockReconnect) {        // 如果為真 結束事件 為假 執行後續事件
      return
    }
    obj.lockReconnect = true
    // 沒連接上會一直重連,設置延遲避免請求過多
    setTimeout(function () {
      obj.createWebSocket(url)    //  新開啟通訊
      obj.lockReconnect = false
    }, 2000)
  }
  // 心跳檢測
  obj.heartCheck = {
    timeout: 6000,   // 60秒
    timeoutObj: null,
    serverTimeoutObj: null,
    reset: function () {
      clearTimeout(this.timeoutObj)
      clearTimeout(this.serverTimeoutObj)
      return this
    },
    start: function () {
      let that = this
      that.timeoutObj = setTimeout(function () {
        // 這裡發送一個心跳,後端收到後,返回一個心跳消息,
        // onmessage拿到返回的心跳就說明連接正常
        obj.ws.send('@')   // 向後端發送消息 如果後端接收  則重置心跳
        that.serverTimeoutObj = setTimeout(function () {  // 如果超過一定時間還沒重置,說明後端主動斷開了
          obj.ws.close()  // 如果onclose會執行reconnect,我們執行ws.close()就行了.如果直接執行reconnect 會觸發onclose導致重連兩次
        }, that.timeout)
      }, that.timeout)
    }
  }
  return obj
}
export default WebSocketMsg

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 今天狀態不是很好,不知道怎麼的,坐在椅子都感覺很難受,難得晚上吃的麻辣香鍋有毒? 特別難受,一陣陣的噁心,強打起精神來,把16次課的最後一道邏輯題寫完了,其實這個挺簡單的,不過沒思考,很簡單的用了很多ifififif…… 應該可以少用點if,邏輯應該會更好看一點,實在是頭暈噁心,就沒多想,寫完了就行 ...
  • jQuery獲取所有父級元素及同級元素及子元素的方法 1.獲取父級元素 $(" id").parent() 獲取其父級元素 $(" id").parents() 獲取其所有的祖先元素 $(" id").closest() 獲取其最近的祖先元素,依次上溯 2.獲取同級元素 $(" id").next( ...
  • 1.在HTML頁面載入js文件的方法: 2.在HTML頁面載入css文件的方法: ...
  • 0.1智能社vuejs(1-11章全套) 0.2英文版learing vuejs 0.3Vue.js實戰小米閱讀開發 0.4走進Vue.js2.0 0.5Vuejs教程45節課 0.6Vue.js+Node.js構建音樂播放器 0.7js高級課程vuejs 0.8vue.js實戰開發系列 0.9Vu ...
  • 在HTML頁面獲取項目根路徑的方法: ...
  • 1、什麼是js 基於對象和事件驅動並且具有相對安全性的客戶端腳本語言,由網景公司開發。 2、js數據類型 1、基本數據類型 undefined,null,number,boolean,string, 1、基本數據類型 undefined,null,number,boolean,string, 3、可 ...
  • 1、順序執行語句 一步一步執行,由上面一步一步執行到下麵 2、條件執行語句 1、if(條件){ 執行條件成立語句 } 2、if(條件){ 執行條件成立語句 }else{ 執行條件不成立 } 3、if(條件){ 執行條件成立 }else if(條件2){ 執行條件成立 }else{ 執行條件不成立 } ...
  • 背景 我相信很多朋友跟我一樣,初次聽到什麼 Flux , Redux , Vuex , 狀態管理 的時候是一臉懵逼的。因為在外面之前前端大部分開發的時候,根本沒有那麼多的概念。自從ReactJS火爆後,什麼 Flux, Redux,React全家桶 是一套一套接踵而來。搞的很多開發者甚是頭大。所謂的 ...
一周排行
    -Advertisement-
    Play Games
  • Dapr Outbox 是1.12中的功能。 本文只介紹Dapr Outbox 執行流程,Dapr Outbox基本用法請閱讀官方文檔 。本文中appID=order-processor,topic=orders 本文前提知識:熟悉Dapr狀態管理、Dapr發佈訂閱和Outbox 模式。 Outbo ...
  • 引言 在前幾章我們深度講解了單元測試和集成測試的基礎知識,這一章我們來講解一下代碼覆蓋率,代碼覆蓋率是單元測試運行的度量值,覆蓋率通常以百分比表示,用於衡量代碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和代碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage)、分支覆蓋率(Bra ...
  • 前言 本文介紹瞭如何使用S7.NET庫實現對西門子PLC DB塊數據的讀寫,記錄了使用電腦模擬,模擬PLC,自至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1.Windows環境下鏈路層網路訪問的行業標準工具(WinPcap_4_1_3.exe)下載鏈接:http ...
  • 從依賴倒置原則(Dependency Inversion Principle, DIP)到控制反轉(Inversion of Control, IoC)再到依賴註入(Dependency Injection, DI)的演進過程,我們可以理解為一種逐步抽象和解耦的設計思想。這種思想在C#等面向對象的編 ...
  • 關於Python中的私有屬性和私有方法 Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點: 1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public); 2、類內部可以訪問私有屬性(方法); 3、類外 ...
  • C++ 訪問說明符 訪問說明符是 C++ 中控制類成員(屬性和方法)可訪問性的關鍵字。它們用於封裝類數據並保護其免受意外修改或濫用。 三種訪問說明符: public:允許從類外部的任何地方訪問成員。 private:僅允許在類內部訪問成員。 protected:允許在類內部及其派生類中訪問成員。 示 ...
  • 寫這個隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉換時的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉子類、用 static_cast 子類轉父類、使用 ...
  • /******************************************************************************************************** * * * 設計雙向鏈表的介面 * * * * Copyright (c) 2023-2 ...
  • 相信接觸過spring做開發的小伙伴們一定使用過@ComponentScan註解 @ComponentScan("com.wangm.lifecycle") public class AppConfig { } @ComponentScan指定basePackage,將包下的類按照一定規則註冊成Be ...
  • 操作系統 :CentOS 7.6_x64 opensips版本: 2.4.9 python版本:2.7.5 python作為腳本語言,使用起來很方便,查了下opensips的文檔,支持使用python腳本寫邏輯代碼。今天整理下CentOS7環境下opensips2.4.9的python模塊筆記及使用 ...