面試官:你知道websocket的心跳機(jī)制嗎梦皮?


哈嘍,大家好桃焕,我是澤南Zn剑肯。在之前的一篇文章寫到, 前端如何使用websocket發(fā)送消息观堂,websocket是怎么建立連接的呢让网?如果斷開了會怎樣?如何一直保持長連接呢师痕?接下來溃睹,本篇文章將會帶你了解--- WebSocket心跳機(jī)制

一、WebSocket心跳機(jī)制
前端實現(xiàn)WebSocket心跳機(jī)制的方式主要有兩種:

使用setInterval定時發(fā)送心跳包七兜。 在前端監(jiān)聽到WebSocket的onclose()事件時丸凭,重新創(chuàng)建WebSocket連接。

第一種方式會對服務(wù)器造成很大的壓力,因為即使WebSocket連接正常惜犀,也要定時發(fā)送心跳包铛碑,從而消耗服務(wù)器資源。第二種方式雖然減輕了服務(wù)器的負(fù)擔(dān)虽界,但是在重連時可能會丟失一些數(shù)據(jù)汽烦。

二、WebSocket心跳包機(jī)制
WebSocket心跳包是WebSocket協(xié)議的崩蛴活機(jī)制撇吞,用于維持長連接。有效的心跳包可以防止長時間不通訊時礁叔,WebSocket自動斷開連接牍颈。

心跳包是指在一定時間間隔內(nèi),WebSocket發(fā)送的空數(shù)據(jù)包琅关。常見的WebSocket心跳包機(jī)制如下:

客戶端定時向服務(wù)器發(fā)送心跳數(shù)據(jù)包煮岁,以保持長連接。 服務(wù)器定時向客戶端發(fā)送心跳數(shù)據(jù)包涣易,以檢測客戶端連接是否正常画机。 雙向發(fā)送心跳數(shù)據(jù)包。

三新症、WebSocket心跳機(jī)制原理
WebSocket心跳機(jī)制的原理是利用心跳包及時發(fā)送和接收數(shù)據(jù)步氏,保證WebSocket長連接不被斷開。WebSocket心跳機(jī)制的原理可以用下面的流程來說明:

客戶端建立WebSocket連接徒爹。 客戶端向服務(wù)器發(fā)送心跳數(shù)據(jù)包荚醒,服務(wù)器接收并返回一個表示接收到心跳數(shù)據(jù)包的響應(yīng)。 當(dāng)服務(wù)器沒有及時接收到客戶端發(fā)送的心跳數(shù)據(jù)包時瀑焦,服務(wù)器會發(fā)送一個關(guān)閉連接的請求腌且。 服務(wù)器定時向客戶端發(fā)送心跳數(shù)據(jù)包,客戶端接收并返回一個表示接收到心跳數(shù)據(jù)包的響應(yīng)榛瓮。 當(dāng)客戶端沒有及時接收到服務(wù)器發(fā)送的心跳數(shù)據(jù)包時铺董,客戶端會重新連接WebSocket

四、WebSocket心跳機(jī)制必要嗎
WebSocket心跳機(jī)制是必要的禀晓,它可以使 WebSocket 連接保持長連接精续,避免斷開連接的情況發(fā)生。同時粹懒,心跳機(jī)制也可以檢查WebSocket連接的狀態(tài)重付,及時處理異常情況。

五凫乖、WebSocket心跳機(jī)制作用
WebSocket心跳機(jī)制的作用主要有以下幾點:

保持WebSocket連接不被斷開确垫。
檢測WebSocket連接狀態(tài)弓颈,及時處理異常情況。
減少WebSocket連接及服務(wù)器資源的消耗删掀。
六翔冀、WebSocket重連機(jī)制
WebSocket在發(fā)送和接收數(shù)據(jù)時,可能會因為網(wǎng)絡(luò)原因披泪、服務(wù)器宕機(jī)等因素而斷開連接纤子,此時需要使用WebSocket重連機(jī)制進(jìn)行重新連接。

WebSocket重連機(jī)制可以通過以下幾種方式實現(xiàn):

前端監(jiān)聽WebSocket的onclose()事件款票,重新創(chuàng)建WebSocket連接控硼。 使用WebSocket插件或庫,例如Sockjs艾少、Stompjs等卡乾。 使用心跳機(jī)制檢測WebSocket連接狀態(tài),自動重連姆钉。 使用斷線重連插件或庫说订,例如ReconnectingWebSocket等。

七潮瓶、WebSocket的缺點和不足
WebSocket的缺點和不足主要有以下幾點:

WebSocket需要瀏覽器和服務(wù)器端都支持該協(xié)議。 WebSocket會增加服務(wù)器的負(fù)擔(dān)钙姊,不適合大規(guī)模連接的應(yīng)用場景毯辅。

八、關(guān)鍵代碼

// 開啟心跳
const start = () => {
clearTimeout(timeoutObj);
// serverTimeoutObj && clearTimeout(serverTimeoutObj);
timeoutObj = setTimeout(function () {
if (websocketRef.current?.readyState === 1) {
//連接正常
sendMessage('hello');
}
}, timeout);
};
const reset = () => {
// 重置心跳 清除時間
clearTimeout(timeoutObj);
// 重啟心跳
start();
};

ws.onopen = (event) => {
onOpenRef.current?.(event, ws);
reconnectTimesRef.current = 0;
start(); // 開啟心跳
setReadyState(ws.readyState || ReadyState.Open);
};
ws.onmessage = (message: WebSocketEventMap['message']) => {
const { data } = message;

if (data === '收到煞额,hello') {
reset();
return;
}
if (JSON.parse(data).status === 408) {
reconnect();
return;
}
onMessageRef.current?.(message, ws);
setLatestMessage(message);
};
const connect = () => {
reconnectTimesRef.current = 0;
connectWs();
};
主要思路:在建立長連接的時候開啟心跳思恐,通過和服務(wù)端發(fā)送信息,得到服務(wù)端給返回的信息膊毁,然后重置心跳胀莹,清楚時間,再重新開啟心跳婚温。如果網(wǎng)絡(luò)斷開的話描焰,會執(zhí)行方法,重新連接栅螟。

作者:一只小錦李_
鏈接:
https://juejin.cn/post/7290005438153867283

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末荆秦,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子力图,更是在濱河造成了極大的恐慌步绸,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吃媒,死亡現(xiàn)場離奇詭異瓤介,居然都是意外死亡吕喘,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進(jìn)店門刑桑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來氯质,“玉大人,你說我怎么就攤上這事漾月〔∩遥” “怎么了?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵梁肿,是天一觀的道長蜓陌。 經(jīng)常有香客問我,道長吩蔑,這世上最難降的妖魔是什么钮热? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮烛芬,結(jié)果婚禮上隧期,老公的妹妹穿的比我還像新娘。我一直安慰自己赘娄,他們只是感情好仆潮,可當(dāng)我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著遣臼,像睡著了一般性置。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上揍堰,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天鹏浅,我揣著相機(jī)與錄音,去河邊找鬼屏歹。 笑死隐砸,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蝙眶。 我是一名探鬼主播季希,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼械馆!你這毒婦竟也來了胖眷?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤霹崎,失蹤者是張志新(化名)和其女友劉穎珊搀,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體尾菇,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡境析,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年囚枪,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片劳淆。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡链沼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出沛鸵,到底是詐尸還是另有隱情括勺,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布曲掰,位于F島的核電站疾捍,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏栏妖。R本人自食惡果不足惜乱豆,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望吊趾。 院中可真熱鬧宛裕,春花似錦、人聲如沸论泛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽屁奏。三九已至疲酌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間了袁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工湿颅, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留载绿,地道東北人。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓油航,卻偏偏與公主長得像崭庸,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子谊囚,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內(nèi)容