成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

前端Websocket的使用

sf190404 / 1106人閱讀

摘要:前段時間因工作業(yè)務需要,簡單了解了一下的概念和前端的使用??偨Y如下概念是一種協(xié)議,通過客戶端和服務器之間的長久的通信,使客戶端和服務器之間可以隨時交換數(shù)據(jù)。說明建立在協(xié)議之上與協(xié)議有著良好的兼容性。

前段時間因工作業(yè)務需要,簡單了解了一下Websocket的概念和前端的使用??偨Y如下:

概念:

Websocket是一種協(xié)議,通過客戶端和服務器之間的長久的TCP通信,使客戶端和服務器之間可以隨時交換數(shù)據(jù)。

使用場景:

由于http協(xié)議只能由客戶端發(fā)起通信,如果服務器有連續(xù)的狀態(tài)變化,客戶端要獲知就非常麻煩。我們只能使用"輪詢":每隔一段時候,就發(fā)出一個詢問,了解服務器有沒有新的信息。最典型的場景就是聊天室。Websocket在解決這樣的需求上非常方便。

說明:

建立在 TCP 協(xié)議之上

與 HTTP 協(xié)議有著良好的兼容性。默認端口也是80和443,并且握手階段采用 HTTP 協(xié)議,因此握手時不容易屏蔽,能通過各種 HTTP 代理服務器

數(shù)據(jù)格式比較輕量,性能開銷小,通信高效

可以發(fā)送文本,也可以發(fā)送二進制數(shù)據(jù)

沒有同源限制,客戶端可以與任意服務器通信

協(xié)議標識符是ws(如果加密,則為wss),服務器網(wǎng)址就是 URL。

API介紹:

WebSocket構造函數(shù): 新建WebSocket實例后,會創(chuàng)建客戶端與服務端的WebSocket連接
let ws = new WebSocket(url)

WebSocket實例的當前狀態(tài):

    ws.readyState // 0: "CONNECTING",表示正在連接
                  // 1: "OPEN", 表示連接成功,可以通信了
                  // 2: "CLOSING", 表示連接正在關閉
                  // 3: "CLOSED", 表示連接已經關閉,或者打開連接失敗。

WebSocket實例的事件:

    ws.onopen = function () {} // 指定連接成功后的回調函數(shù)
    ws.onclose = function () {} // 指定連接關閉后的回調函數(shù)
    ws.onmessage = function () {} // 指定收到服務器數(shù)據(jù)后的回調函數(shù)
    ws.onerror = function () {} // 指定報錯時的回調函數(shù)

WebSocket實例向后臺推送消息的方法:
ws.send(message)

WebSocket應用實例
/* WebSocket封裝
 * @param url: WebSocket接口地址與攜帶參數(shù)必填
 * @param onOpenFunc: WebSocket的onopen回調函數(shù),如果不需要可傳null
 * @param onMessageFunc: WebSocket的onmessage回調函數(shù),如果不需要可傳null
 * @param onCloseFunc: WebSocket的onclose回調函數(shù),如果不需要可傳null
 * @param onErrorFunc: WebSocket的onerror回調函數(shù),如果不需要可傳null
 * @param heartMessage: 發(fā)送后臺的心跳包參數(shù),必填 (給服務端的心跳包就是定期給服務端發(fā)送消息)
 * @param timer: 給后臺傳送心跳包的間隔時間,不傳時使用默認值3000毫秒
 * @param isReconnect: 是否斷掉立即重連,不傳true時不重連
*/
function useWebSocket (url, onOpenFunc, onMessageFunc, onCloseFunc, onErrorFunc, heartMessage, timer, isReconnect) {
  let isConnected = false // 設定已鏈接webSocket標記
  // websocket對象
  let ws = null
  // 創(chuàng)建并鏈接webSocket
  let connect = () => {
    // 如果未鏈接webSocket,則創(chuàng)建一個新的webSocket
    if (!isConnected) {
      ws = new WebSocket(url)
      isConnected = true
    }
  }
  // 向后臺發(fā)送心跳消息
  let heartCheck = () => {
    ws.send(JSON.stringify(heartMessage))
  }
  // 初始化事件回調函數(shù)
  let initEventHandle = () => {
    ws.addEventListener("open", (e) => {
      console.log("onopen", e)
      // 給后臺發(fā)心跳請求,在onmessage中取得消息則說明鏈接正常
      heartCheck()
      // 如果傳入了函數(shù),執(zhí)行onOpenFunc
      if (!onOpenFunc) {
        return false
      } else {
        onOpenFunc(e)
      }
    })
    ws.addEventListener("message", (e) => {
      console.log("onmessage", e)
      // 接收到任何后臺消息都說明當前連接是正常的
      if (!e) {
        console.log("get nothing from service")
        return false
      } else {
        // 如果獲取到后臺消息,則timer毫秒后再次發(fā)起心跳請求給后臺,檢測是否斷連
        setTimeout(() => {
          heartCheck()
        }, !timer ? 3000 : timer)
      }
      // 如果傳入了函數(shù),執(zhí)行onMessageFunc
      if (!onMessageFunc) {
        return false
      } else {
        onMessageFunc(e)
      }
    })
    ws.addEventListener("close", (e) => {
      console.log("onclose", e)
      // 如果傳入了函數(shù),執(zhí)行onCloseFunc
      if (!onCloseFunc) {
        return false
      } else {
        onCloseFunc(e)
      }
      if (isReconnect) { // 如果斷開立即重連標志為true
        // 重新鏈接webSocket
        connect()
      }
    })
    ws.addEventListener("error", (e) => {
      console.log("onerror", e)
      // 如果傳入了函數(shù),執(zhí)行onErrorFunc
      if (!onErrorFunc) {
        return false
      } else {
        onErrorFunc(e)
      }
      if (isReconnect) { // 如果斷開立即重連標志為true
        // 重新鏈接webSocket
        connect()
      }
    })
  }
  // 初始化webSocket
  (() => {
    // 1.創(chuàng)建并鏈接webSocket
    connect()
    // 2.初始化事件回調函數(shù)
    initEventHandle()
    // 3.返回是否已連接
    return ws
  })()
}

// WebSocket函數(shù)使用實例
useWebSocket( url, // url
              null, // onopen回調
              (e) => { // onmessage回調
                let res = JSON.parse(e.data) // 后端返回的數(shù)據(jù)
                console.log(res)
              },
              null, // onclose回調
              null, // onerror回調
              { // 心跳包消息
                "action": "9999",
                "eventType": "100",
                "requestId": ""
              },
              null, // 傳送心跳包的間隔時間
              true // 斷掉立即重連
)   
參考地址: http://www.ruanyifeng.com/blo...

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://systransis.cn/yun/108233.html

相關文章

  • 前端技術棧補全計劃---websocket

    摘要:本系列文章旨在總結前端技術棧中的一些通用技術本文主要總結之前在之前,請求的主要模式是客戶端發(fā)起請求,服務端負責接收,并返回數(shù)據(jù)。一種比較常見的方式是服務端攜帶參數(shù),訪問某個指定的前端頁面,例如后端主動訪問。協(xié)議是基于的一種新的網(wǎng)絡協(xié)議。 本系列文章旨在總結前端技術棧中的一些通用技術本文主要總結websocket websocket WebSocket之前 在WebSocket之前,ht...

    wzyplus 評論0 收藏0
  • 前端面試之websocket

    摘要:服務器將資源復本寫到套接字,由客戶端讀取。釋放連接連接服務器主動關閉套接字,釋放連接客戶端被動關閉套接字,釋放連接。使用約定好的計算握手消息,并使用生成的隨機數(shù)對消息進行加密,最后將之前生成的所有信息發(fā)送給網(wǎng)站。 還是同以往一樣,面試會考到的地方,我都會做出標記,websocket如何在前端如何用的,這個得用,別這個都不知道,那這個教程就沒用了。如果你想對其原理進行深入了解,那么本教程...

    codeGoogle 評論0 收藏0
  • 前端面試之websocket

    摘要:服務器將資源復本寫到套接字,由客戶端讀取。釋放連接連接服務器主動關閉套接字,釋放連接客戶端被動關閉套接字,釋放連接。使用約定好的計算握手消息,并使用生成的隨機數(shù)對消息進行加密,最后將之前生成的所有信息發(fā)送給網(wǎng)站。 還是同以往一樣,面試會考到的地方,我都會做出標記,websocket如何在前端如何用的,這個得用,別這個都不知道,那這個教程就沒用了。如果你想對其原理進行深入了解,那么本教程...

    cooxer 評論0 收藏0
  • 使用Node做一個簡單聊天室(附webSocket教程)

    摘要:用來接受房間給此命名有一個新連接創(chuàng)建成功然后瀏覽器控制臺鏈接成功之后,輸入為了更好地測試效果,可以開啟兩個控制臺,一個控制臺發(fā)送消息,另外一個控制臺會跳出消息,相當于聊天的推送。 之前一直在講理論玩,這次說點干貨吧。順帶說一下,那個從零單排vue系列,過些日子再寫吧。尤神終究是尤神,一時半會兒也確實難以把vue整個模擬出來。 繼續(xù)說正題。(這里需要一個node環(huán)境,電腦上如果沒有裝no...

    HollisChuang 評論0 收藏0

發(fā)表評論

0條評論

sf190404

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<