使用gateway做長連接,未做心跳時,1分鐘不發(fā)送消息就斷開鏈接,增加心跳報文后,分鐘左右也會斷開鏈接,不清楚什么原因。
終端心跳報文計時如下,每次收到、發(fā)送消息都會重新計時,終端ws.closed已經注釋掉:
let timer;
// 定時器函數(shù)
function startTimer() {
clearInterval(timer); // 確保只有一個定時器在運行
// 發(fā)送ping報文的邏輯
function sendPing() {
ws.send('ping');
console.log("發(fā)送ping報文");
// 重置計數(shù)器的邏輯
resetTimer();
}
// 啟動定時器
timer = setInterval(sendPing, 50000); // 每50秒執(zhí)行一次sendPing函數(shù)
}
// 重置計數(shù)器函數(shù)
function resetTimer() {
clearInterval(timer);
startTimer();
}
// 啟動定時器
startTimer();
服務端把start_gateway.php中注釋代碼去掉,簡單做了修改如下:
// 心跳間隔
$gateway->pingInterval = 55;
// 心跳數(shù)據(jù)
$gateway->pingData = 'ping';
WebSocket is already in CLOSING or CLOSED state.
操作系統(tǒng)ubuntu;
Workerman version:4.1.11
PHP version:8.1.2-1ubuntu2.13
"每次收到、發(fā)送消息都會重新計時" 這個感覺會出現(xiàn)bug。如果服務端強制要求每55秒發(fā)一個心跳包,但是你延遲了下比如60秒才發(fā)送,那么連接可能就被服務端斷開了。
而且刷新界面,重新建立鏈接,一個消息也不發(fā)的情況下,還是會自動斷開,只是斷開時間不一樣,有一個瀏覽器窗口400s斷開了,有一個500s+了還沒斷開,奇怪,感覺不穩(wěn)定,環(huán)境在虛擬機中,理論上不會是網絡的問題
自己頂下帖子吧,有可能是瀏覽器原因,firefox就不會斷開,但是,chrome就會斷開,網上查詢可能對websocket處理機制不一樣,chrome發(fā)生心跳報文后,還需要接收到心跳報文才行,不然認為已斷開,求證?。?/p>
chrome 使用在線測試工具,在發(fā)送不固定的幾個ping包之后,就出現(xiàn)10:34:19 => CLOSED => 1006 CLOSE_ABNORMAL,firefox 不會,一直處于正常情況。
網上解釋:
當Chrome瀏覽器不符合WebSocket標準時,情況就是這樣。當服務器啟動關閉并向客戶端發(fā)送關閉幀時,Chrome認為這是錯誤,并使用代碼1006并沒有原因消息將其報告給JS端。在我的測試中,Chrome從未響應服務器啟動的關閉幀(關閉代碼1000),表明代碼1006可能表示Chrome正在報告自己的內部錯誤。
PS Firefox v57.00可以正確處理此情況,并成功將服務器的原因消息傳遞給JS端。