国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

WebSocket:心跳檢測與重連機制,你會嗎?

開發(fā) 前端
不管是客戶端發(fā)送心跳還是服務(wù)端發(fā)送心跳,連接都有斷開的可能。例如瀏覽器最小化js被暫停、瀏覽器切換到其它tab頁面js被暫停、電腦進入睡眠等等、移動端切換網(wǎng)絡(luò)、信號變?nèi)酢⑹謾C黑屏、手機應(yīng)用切換到后臺、路由故障、業(yè)務(wù)主動斷開等。尤其是外網(wǎng)環(huán)境復(fù)雜,很多路由節(jié)點會清理1分鐘內(nèi)不活躍的連接,這也是為什么心跳間隔推薦小于1分鐘的原因。

為什么需要心跳檢測?

正常的情況客戶端斷開連接會向服務(wù)端發(fā)送一個fin包,服務(wù)端收到fin包后得知客戶端連接斷開,則立刻觸發(fā)onClose事件回調(diào)。

心跳包格式:WebSocket協(xié)議RFC6455中有定義控制幀的格式Ping幀包含一個操作碼0x9,Pong幀包含一個操作碼0xA。客戶端發(fā)送Ping幀,服務(wù)端收到Ping幀后回一個響應(yīng)Pong幀。

但是有些極端情況如客戶端掉電、網(wǎng)絡(luò)關(guān)閉、拔網(wǎng)線、路由故障等,這些極端情況客戶端無法發(fā)送fin包給服務(wù)端,服務(wù)端便無法知道連接已經(jīng)斷開。如果客戶端與服務(wù)端定時有心跳數(shù)據(jù)傳輸,則會比較及時的發(fā)現(xiàn)連接斷開,觸發(fā)onClose事件回調(diào)。

另外路由節(jié)點防火墻會關(guān)閉長時間不通訊的socket連接,導(dǎo)致socket長連接斷開。所以需要客戶端與服務(wù)端定時發(fā)送心跳數(shù)據(jù)保持連接不被斷開。

心跳原理

客戶端定時每X秒(推薦小于60秒)向服務(wù)端發(fā)送特定數(shù)據(jù)(任意數(shù)據(jù)都可),服務(wù)端設(shè)定為X秒沒有收到客戶端心跳則認(rèn)為客戶端掉線,并關(guān)閉連接觸發(fā)onClose回調(diào)。這樣即通過心跳檢測請求維持了連接(避免連接因長時間不活躍而被網(wǎng)關(guān)防火墻關(guān)閉),也能讓服務(wù)端比較及時的知道客戶端是否異常掉線。

心跳包機制

WebSocket心跳包機制WebSocket心跳包是WebSocket協(xié)議的保活機制,用于維持長連接。有效的心跳包可以防止長時間不通訊時,WebSocket自動斷開連接。

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

客戶端

客戶端定時向服務(wù)器發(fā)送心跳數(shù)據(jù)包,以保持長連接。

this.heartbeatTimer = setInterval(() => {
    ws.send('{"event":"ping","content":"ping heartbeat"}');
}, originData.ping_interval)
服務(wù)端

服務(wù)器定時向客戶端發(fā)送心跳數(shù)據(jù)包,以檢測客戶端連接是否正常。

$gateway = new Gateway("websocket://0.0.0.0:8783");

$gateway->pingInterval = 55;

$gateway->pingNotResponseLimit = 0;

// 服務(wù)端定時向客戶端發(fā)送的數(shù)據(jù)
$gateway->pingData = '{"type":"ping"}';

以上服務(wù)端會定時55秒給客戶端發(fā)心跳數(shù)據(jù){"type":"ping"},而客戶端不需要定時向服務(wù)端發(fā)送心跳數(shù)據(jù)。

  • pingNotResponseLimit = 0代表服務(wù)端允許客戶端不發(fā)送心跳,服務(wù)端不會因為客戶端長時間沒發(fā)送數(shù)據(jù)而斷開連接。
  • pingNotResponseLimit = 1,則代表客戶端必須定時發(fā)送數(shù)據(jù)給服務(wù)端,否則pingNotResponseLimit*pingInterval=55秒內(nèi)沒有任何數(shù)據(jù)發(fā)來則關(guān)閉對應(yīng)連接,并觸發(fā)onClose。

說明

  • Gateway::$pingInterval心跳檢測時間間隔 單位:秒。如果設(shè)置為0代表不做任何心跳檢測。
  • Gateway::$pingNotResponseLimit 客戶端連續(xù)$pingNotResponseLimit次$pingInterval時間內(nèi)不發(fā)送任何數(shù)據(jù)(包括但不限于心跳數(shù)據(jù))則斷開鏈接,并觸發(fā)onClose。如果設(shè)置為0代表客戶端不用發(fā)送心跳數(shù)據(jù),即通過TCP層面檢測連接的連通性(極端情況至少10分鐘才能檢測到連接斷開,甚至可能永遠(yuǎn)檢測不到)
  • Gateway::$pingData 當(dāng)需要服務(wù)端定時給客戶端發(fā)送心跳數(shù)據(jù)時, $gateway->pingData設(shè)置為服務(wù)端要發(fā)送的心跳請求數(shù)據(jù),心跳數(shù)據(jù)是任意的,只要客戶端能識別即可。客戶端收到心跳數(shù)據(jù)可以忽略不做任何處理。

注意

當(dāng)設(shè)置為服務(wù)端主動發(fā)送心跳時,心跳間隔并不是100%精準(zhǔn)。當(dāng)客戶端連接成功后,服務(wù)端發(fā)來的第一個心跳的時間間隔可能要小于服務(wù)器設(shè)置的值。

當(dāng)設(shè)置為服務(wù)端主動發(fā)送心跳時,如果客戶端最近有發(fā)來數(shù)據(jù),那么證明客戶端存活,服務(wù)端會省略一個心跳,下個心跳大約1.5*$gateway->pingInterval秒后發(fā)送。

如果心跳是客戶端發(fā)送,$gateway->pingNotResponseLimit最好大于0,這樣可以及時檢測到一些死連接(連接已經(jīng)斷開,但是服務(wù)端不知道)

心跳機制原理

WebSocket心跳機制的原理是利用心跳包及時發(fā)送和接收數(shù)據(jù),保證WebSocket長連接不被斷開。

WebSocket心跳機制的原理可以用下面的流程來說明:

  1. 客戶端建立WebSocket連接。
  2. 客戶端向服務(wù)器發(fā)送心跳數(shù)據(jù)包,服務(wù)器接收并返回一個表示接收到心跳數(shù)據(jù)包的響應(yīng)。
  3. 當(dāng)服務(wù)器沒有及時接收到客戶端發(fā)送的心跳數(shù)據(jù)包時,服務(wù)器會發(fā)送一個關(guān)閉連接的請求。
  4. 服務(wù)器定時向客戶端發(fā)送心跳數(shù)據(jù)包,客戶端接收并返回一個表示接收到心跳數(shù)據(jù)包的響應(yīng)。
  5. 當(dāng)客戶端沒有及時接收到服務(wù)器發(fā)送的心跳數(shù)據(jù)包時,客戶端會重新連接WebSocket

心跳機制作用

  • 保持WebSocket連接不被斷開。
  • 檢測WebSocket連接狀態(tài),及時處理異常情況。
  • 減少WebSocket連接及服務(wù)器資源的消耗。

完整代碼

服務(wù)端心跳(不推薦)

修改配置文件config\plugin\webman\gateway-worker\process.php進程配置文件。

'pingInterval' => 30,
'pingNotResponseLimit' => 0,
'pingData' => '{"event":"ping","msg":"我是服務(wù)端主動心跳檢測"}',

控制臺檢測記錄

圖片圖片

客戶端心跳(推薦)
let $timeout = null;
let ws = new WebSocket("ws://127.0.0.1:8783");
ws.onopen = function(evt) {
    let $_content = {
        "event": "join",
        "mode": 1,
        "group_id": 0,
        "from_user_id": "10086",
        "from_username": "開源技術(shù)小棧",
        "to_user_id": "10000",
        "content": "加入會話",
    };
    ws.send(JSON.stringify($_content));
};

ws.onmessage = function(evt) {
    console.log( "【開源技術(shù)小棧】接受消息: " + evt.data);
    let _obj = JSON.parse(evt.data);
    if (_obj.data.event === 'init') {
        sendHeartbeat();
    }
};

function sendHeartbeat() {
    console.log('客戶端定時發(fā)送心跳');
    ws.send('{"event":"ping","content":"開源技術(shù)小棧我在線呢!"}');
    $timeout = setTimeout(sendHeartbeat, 3000);
}

ws.onclose = function() {
    clearTimeout($timeout);
    console.log('沒有網(wǎng)了,睡覺去了');
};

控制臺檢測記錄

圖片圖片

斷線重連

不管是客戶端發(fā)送心跳還是服務(wù)端發(fā)送心跳,連接都有斷開的可能。例如瀏覽器最小化js被暫停、瀏覽器切換到其它tab頁面js被暫停、電腦進入睡眠等等、移動端切換網(wǎng)絡(luò)、信號變?nèi)酢⑹謾C黑屏、手機應(yīng)用切換到后臺、路由故障、業(yè)務(wù)主動斷開等。尤其是外網(wǎng)環(huán)境復(fù)雜,很多路由節(jié)點會清理1分鐘內(nèi)不活躍的連接,這也是為什么心跳間隔推薦小于1分鐘的原因。

連接在外網(wǎng)環(huán)境很容易被斷開,所以斷線重連是長連接應(yīng)用必須具備的功能(斷線重連只能客戶端做,服務(wù)端無法實現(xiàn))。例如瀏覽器websocket需要監(jiān)聽onclose事件,當(dāng)發(fā)生onclose時建立新的連接(為避免需崩可延建立連接)。更嚴(yán)格一點,服務(wù)端也應(yīng)該定時發(fā)起心跳數(shù)據(jù),并且客戶端需要定時監(jiān)測服務(wù)端的心跳數(shù)據(jù)是否超時,超過規(guī)定時間未收到服務(wù)端心跳數(shù)據(jù)應(yīng)該認(rèn)定連接已經(jīng)斷開,需要執(zhí)行close關(guān)閉連接,并重新建立新的連接。

責(zé)任編輯:武曉燕 來源: 開源技術(shù)小棧
相關(guān)推薦

2024-03-21 08:34:49

Vue3WebSocketHTTP

2024-12-23 06:00:00

TCPC#網(wǎng)絡(luò)

2020-09-30 14:07:05

Kafka心跳機制API

2024-09-06 11:11:20

2021-07-30 15:06:05

鴻蒙HarmonyOS應(yīng)用

2021-07-20 08:23:49

HTTPWebSocketWeb

2024-05-29 07:50:41

2024-04-29 06:39:45

WebSocketSocketC#

2023-12-04 07:09:53

函數(shù)遞歸python

2021-08-19 15:36:09

數(shù)據(jù)備份存儲備份策略

2021-04-16 15:02:11

CAP理論分布式

2021-04-14 06:53:52

C# 修飾符 Public

2024-02-22 08:31:26

數(shù)據(jù)恢復(fù)工具MySQL回滾SQL

2025-08-19 17:32:16

2012-06-20 10:47:25

Team Leader

2019-05-07 15:49:27

AI人工智能藝術(shù)

2025-06-03 01:45:00

2010-07-13 10:40:30

唐駿

2024-09-02 09:31:19

2024-05-14 08:19:54

點贊
收藏

51CTO技術(shù)棧公眾號

激情伊人五月天久久综合| 看全色黄大色大片| 国产精品粉嫩| 亚洲人精品午夜在线观看| 日韩不卡在线视频| 国内一区二区在线视频观看| 国产一区二区三区在线观看免费 | 天天爽天天狠久久久| 天堂日韩电影| 精品视频久久久久久久| 全色精品综合影院| 中文字幕亚洲欧美在线不卡| 绯色av一区二区| 欧美性猛片xxxx免费看久爱| 国产福利小视频在线观看| 午夜日韩在线电影| 最新日韩精品| 91在线精品一区二区三区| 亚洲欧美制服丝袜| 日本电影久久久| 国产精品专区一| 久久亚洲导航| 欧美巨大另类极品videosbest| 成人在线视频观看| 狠狠色伊人亚洲综合网站色 | 久久精品久久精品国产大片| 中文字幕一区二区三中文字幕| 在线免费观看的av| 欧美一区在线直播| 欧美18xxxx| 国语精品中文字幕| 国产欧美在线| 日本在线播放一区| 国产精品人成在线观看免费| www.激情小说.com| 亚洲国产精品久久艾草纯爱| 成人在线免费看黄| 综合久久国产九一剧情麻豆| 超碰在线网址| 日韩av不卡播放| 成人盗摄视频| 超碰网在线观看| 丝袜国产日韩另类美女| 久久精品久久久久| 青青草国产免费一区二区下载| 国产激情在线看| 亚洲香蕉视频| 风间由美一区二区三区| 精品久久久久久久久中文字幕| 日韩中文字幕| 午夜激情av在线| 91精品国产91久久久久久久久| 国产欧美日韩在线视频| 成年女人在线看片| 在线天堂一区av电影| 亚洲精品v欧美精品v日韩精品| 久久av中文| 国产精品免费在线播放| 岛国精品一区二区| 91网在线播放| 日韩美女视频在线观看| 久久国产福利国产秒拍| 极品粉嫩饱满一线天在线| 精品亚洲一区二区三区四区五区| 天堂久久av| 午夜精品久久久久久久无码| 欧美日韩aaaaa| 亚洲另类av| av大片在线播放| 成人福利在线视频| 一本久久精品一区二区| 亚洲福利天堂| 91在线超碰| 三级久久三级久久| 精品一区二区三区免费毛片| 国产精品色一区二区三区| 欧美调教在线| 日韩在线观看av| 激情av综合网| 欧美亚洲色图校园春色| 天天综合视频在线观看| 五月天丁香婷| 日韩视频一二三| 亚洲一区二区三区xxx视频| 久热精品视频在线观看| 欧美午夜精品久久久久久孕妇| 成人黄色国产精品网站大全在线免费观看| 精品福利一区| 在线观看国产一级片| 欧美在线一区二区视频| 国产午夜精品在线观看| 亚洲伊人影院| 中文字幕理伦片免费看| 欧美性bbwbbwbbwhd| 色悠悠久久88| 一区二区三区91| 欧美精品成人| 午夜在线观看视频| 日本一区免费看| 欧美日韩aaa| 国产精品自拍在线| 成人午夜sm精品久久久久久久| 精品中文字幕人| 欧美三级中文字幕在线观看| 亚洲精品无吗| 日本在线www| 国产 日韩 亚洲 欧美| 国产欧美亚洲精品| 色婷婷综合久久久中文一区二区 | 96sao精品视频在线观看| 欧美精品一区二区高清在线观看| 欧美性生交xxxxxdddd| 精品国产一区久久久| 国产一区二区三区在线免费观看 | 亚亚洲欧洲精品| 国产免费视频传媒| 桥本有菜av在线| 一本久道久久综合| 成人免费看片网站| 亚洲一区二区自拍| 欧美成人精品三级在线观看| 欧美xxxxxxxx| 亚洲图片欧美色图| 国产日韩av一区| 国产高清不卡一区二区| 久久99久久99精品免视看婷婷 | 26uuu国产电影一区二区| 欧美久久99| 久久精品久久久| 国产不卡一二三区| 91在线一区| 精品中国亚洲| 亚洲五码在线| 一区二区三区视频免费视频观看网站| 成人开心激情| 奇米777日韩| av日韩电影| 欧美天堂在线| 最新日韩一区| 亚洲国产中文在线| 亚洲第一福利专区| 欧美r级电影| 蜜桃免费网站一区二区三区| 精品亚洲成av人在线观看| 精品写真视频在线观看| 一本一本久久a久久综合精品| 亚洲天堂久久| 国产欧美亚洲一区| 一区二区影视| 亚洲综合社区| 91在线高清观看| 亚洲男人天堂av网| 欧美日韩中文字幕在线视频| 日韩一卡二卡三卡| 日韩中文字幕免费看| 一区二区精彩视频| 性xxxx欧美老肥妇牲乱| 国产欧美另类| 久久久一区二区| 91久久精品一区二区三| 亚洲成色999久久网站| 亚洲图片欧美午夜| 欧洲日韩成人av| 精品一区二区国产| 精品丰满人妻无套内射| 欧美特级aaa| 婷婷电影在线观看| 日韩不卡一区| 成人免费网址在线| 免费黄色网址在线观看| 在线免费观看亚洲| 久久精品伊人| 一区二区三区在线观看动漫| 日韩欧美在线网站| 久久久噜噜噜久久| 久久精品国产一区二区三区日韩| 久久久久久久片| 1024免费在线视频| 亚洲婷婷伊人| jzzjzzjzz亚洲成熟少妇| 亚洲天堂手机| 日韩国产欧美在线观看| 五月婷婷激情综合| 久久全球大尺度高清视频| 熟女视频一区二区三区| 在线免费观看黄色av| 亚洲人成精品久久久 | 欧美日韩性视频在线| 中文字幕亚洲国产| 天堂一区二区三区| 天堂中文а√在线| 欧美伦理片在线看| 国产白浆在线免费观看| 小处雏高清一区二区三区| 亚洲天天做日日做天天谢日日欢| 国产亚洲人成a一在线v站| 日韩不卡视频一区二区| 久久uomeier| 成人亚洲一区二区一| 久久艹在线视频|