摘要:前段時(shí)間因工作業(yè)務(wù)需要,簡(jiǎn)單了解了一下的概念和前端的使用??偨Y(jié)如下概念是一種協(xié)議,通過(guò)客戶端和服務(wù)器之間的長(zhǎng)久的通信,使客戶端和服務(wù)器之間可以隨時(shí)交換數(shù)據(jù)。說(shuō)明建立在協(xié)議之上與協(xié)議有著良好的兼容性。
前段時(shí)間因工作業(yè)務(wù)需要,簡(jiǎn)單了解了一下Websocket的概念和前端的使用。總結(jié)如下:
概念:Websocket是一種協(xié)議,通過(guò)客戶端和服務(wù)器之間的長(zhǎng)久的TCP通信,使客戶端和服務(wù)器之間可以隨時(shí)交換數(shù)據(jù)。
使用場(chǎng)景:由于http協(xié)議只能由客戶端發(fā)起通信,如果服務(wù)器有連續(xù)的狀態(tài)變化,客戶端要獲知就非常麻煩。我們只能使用"輪詢":每隔一段時(shí)候,就發(fā)出一個(gè)詢問(wèn),了解服務(wù)器有沒(méi)有新的信息。最典型的場(chǎng)景就是聊天室。Websocket在解決這樣的需求上非常方便。
說(shuō)明:建立在 TCP 協(xié)議之上
與 HTTP 協(xié)議有著良好的兼容性。默認(rèn)端口也是80和443,并且握手階段采用 HTTP 協(xié)議,因此握手時(shí)不容易屏蔽,能通過(guò)各種 HTTP 代理服務(wù)器
數(shù)據(jù)格式比較輕量,性能開(kāi)銷小,通信高效
可以發(fā)送文本,也可以發(fā)送二進(jìn)制數(shù)據(jù)
沒(méi)有同源限制,客戶端可以與任意服務(wù)器通信
協(xié)議標(biāo)識(shí)符是ws(如果加密,則為wss),服務(wù)器網(wǎng)址就是 URL。
API介紹:WebSocket構(gòu)造函數(shù): 新建WebSocket實(shí)例后,會(huì)創(chuàng)建客戶端與服務(wù)端的WebSocket連接
let ws = new WebSocket(url)
WebSocket實(shí)例的當(dāng)前狀態(tài):
ws.readyState // 0: "CONNECTING",表示正在連接 // 1: "OPEN", 表示連接成功,可以通信了 // 2: "CLOSING", 表示連接正在關(guān)閉 // 3: "CLOSED", 表示連接已經(jīng)關(guān)閉,或者打開(kāi)連接失敗。
WebSocket實(shí)例的事件:
ws.onopen = function () {} // 指定連接成功后的回調(diào)函數(shù) ws.onclose = function () {} // 指定連接關(guān)閉后的回調(diào)函數(shù) ws.onmessage = function () {} // 指定收到服務(wù)器數(shù)據(jù)后的回調(diào)函數(shù) ws.onerror = function () {} // 指定報(bào)錯(cuò)時(shí)的回調(diào)函數(shù)
WebSocket實(shí)例向后臺(tái)推送消息的方法:
ws.send(message)
/* WebSocket封裝 * @param url: WebSocket接口地址與攜帶參數(shù)必填 * @param onOpenFunc: WebSocket的onopen回調(diào)函數(shù),如果不需要可傳null * @param onMessageFunc: WebSocket的onmessage回調(diào)函數(shù),如果不需要可傳null * @param onCloseFunc: WebSocket的onclose回調(diào)函數(shù),如果不需要可傳null * @param onErrorFunc: WebSocket的onerror回調(diào)函數(shù),如果不需要可傳null * @param heartMessage: 發(fā)送后臺(tái)的心跳包參數(shù),必填 (給服務(wù)端的心跳包就是定期給服務(wù)端發(fā)送消息) * @param timer: 給后臺(tái)傳送心跳包的間隔時(shí)間,不傳時(shí)使用默認(rèn)值3000毫秒 * @param isReconnect: 是否斷掉立即重連,不傳true時(shí)不重連 */ function useWebSocket (url, onOpenFunc, onMessageFunc, onCloseFunc, onErrorFunc, heartMessage, timer, isReconnect) { let isConnected = false // 設(shè)定已鏈接webSocket標(biāo)記 // websocket對(duì)象 let ws = null // 創(chuàng)建并鏈接webSocket let connect = () => { // 如果未鏈接webSocket,則創(chuàng)建一個(gè)新的webSocket if (!isConnected) { ws = new WebSocket(url) isConnected = true } } // 向后臺(tái)發(fā)送心跳消息 let heartCheck = () => { ws.send(JSON.stringify(heartMessage)) } // 初始化事件回調(diào)函數(shù) let initEventHandle = () => { ws.addEventListener("open", (e) => { console.log("onopen", e) // 給后臺(tái)發(fā)心跳請(qǐng)求,在onmessage中取得消息則說(shuō)明鏈接正常 heartCheck() // 如果傳入了函數(shù),執(zhí)行onOpenFunc if (!onOpenFunc) { return false } else { onOpenFunc(e) } }) ws.addEventListener("message", (e) => { console.log("onmessage", e) // 接收到任何后臺(tái)消息都說(shuō)明當(dāng)前連接是正常的 if (!e) { console.log("get nothing from service") return false } else { // 如果獲取到后臺(tái)消息,則timer毫秒后再次發(fā)起心跳請(qǐng)求給后臺(tái),檢測(cè)是否斷連 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) { // 如果斷開(kāi)立即重連標(biāo)志為true // 重新鏈接webSocket connect() } }) ws.addEventListener("error", (e) => { console.log("onerror", e) // 如果傳入了函數(shù),執(zhí)行onErrorFunc if (!onErrorFunc) { return false } else { onErrorFunc(e) } if (isReconnect) { // 如果斷開(kāi)立即重連標(biāo)志為true // 重新鏈接webSocket connect() } }) } // 初始化webSocket (() => { // 1.創(chuàng)建并鏈接webSocket connect() // 2.初始化事件回調(diào)函數(shù) initEventHandle() // 3.返回是否已連接 return ws })() } // WebSocket函數(shù)使用實(shí)例 useWebSocket( url, // url null, // onopen回調(diào) (e) => { // onmessage回調(diào) let res = JSON.parse(e.data) // 后端返回的數(shù)據(jù) console.log(res) }, null, // onclose回調(diào) null, // onerror回調(diào) { // 心跳包消息 "action": "9999", "eventType": "100", "requestId": "" }, null, // 傳送心跳包的間隔時(shí)間 true // 斷掉立即重連 )
參考地址: http://www.ruanyifeng.com/blo...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/108233.html
摘要:本系列文章旨在總結(jié)前端技術(shù)棧中的一些通用技術(shù)本文主要總結(jié)之前在之前,請(qǐng)求的主要模式是客戶端發(fā)起請(qǐng)求,服務(wù)端負(fù)責(zé)接收,并返回?cái)?shù)據(jù)。一種比較常見(jiàn)的方式是服務(wù)端攜帶參數(shù),訪問(wèn)某個(gè)指定的前端頁(yè)面,例如后端主動(dòng)訪問(wèn)。協(xié)議是基于的一種新的網(wǎng)絡(luò)協(xié)議。 本系列文章旨在總結(jié)前端技術(shù)棧中的一些通用技術(shù)本文主要總結(jié)websocket websocket WebSocket之前 在WebSocket之前,ht...
摘要:服務(wù)器將資源復(fù)本寫到套接字,由客戶端讀取。釋放連接連接服務(wù)器主動(dòng)關(guān)閉套接字,釋放連接客戶端被動(dòng)關(guān)閉套接字,釋放連接。使用約定好的計(jì)算握手消息,并使用生成的隨機(jī)數(shù)對(duì)消息進(jìn)行加密,最后將之前生成的所有信息發(fā)送給網(wǎng)站。 還是同以往一樣,面試會(huì)考到的地方,我都會(huì)做出標(biāo)記,websocket如何在前端如何用的,這個(gè)得用,別這個(gè)都不知道,那這個(gè)教程就沒(méi)用了。如果你想對(duì)其原理進(jìn)行深入了解,那么本教程...
摘要:服務(wù)器將資源復(fù)本寫到套接字,由客戶端讀取。釋放連接連接服務(wù)器主動(dòng)關(guān)閉套接字,釋放連接客戶端被動(dòng)關(guān)閉套接字,釋放連接。使用約定好的計(jì)算握手消息,并使用生成的隨機(jī)數(shù)對(duì)消息進(jìn)行加密,最后將之前生成的所有信息發(fā)送給網(wǎng)站。 還是同以往一樣,面試會(huì)考到的地方,我都會(huì)做出標(biāo)記,websocket如何在前端如何用的,這個(gè)得用,別這個(gè)都不知道,那這個(gè)教程就沒(méi)用了。如果你想對(duì)其原理進(jìn)行深入了解,那么本教程...
摘要:用來(lái)接受房間給此命名有一個(gè)新連接創(chuàng)建成功然后瀏覽器控制臺(tái)鏈接成功之后,輸入為了更好地測(cè)試效果,可以開(kāi)啟兩個(gè)控制臺(tái),一個(gè)控制臺(tái)發(fā)送消息,另外一個(gè)控制臺(tái)會(huì)跳出消息,相當(dāng)于聊天的推送。 之前一直在講理論玩,這次說(shuō)點(diǎn)干貨吧。順帶說(shuō)一下,那個(gè)從零單排vue系列,過(guò)些日子再寫吧。尤神終究是尤神,一時(shí)半會(huì)兒也確實(shí)難以把vue整個(gè)模擬出來(lái)。 繼續(xù)說(shuō)正題。(這里需要一個(gè)node環(huán)境,電腦上如果沒(méi)有裝no...
閱讀 2076·2019-08-30 15:52
閱讀 3062·2019-08-29 16:09
閱讀 1380·2019-08-28 18:30
閱讀 2517·2019-08-26 12:24
閱讀 1162·2019-08-26 12:12
閱讀 2323·2019-08-26 10:45
閱讀 628·2019-08-23 17:52
閱讀 966·2019-08-23 16:03