国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

gateway使用心跳報文,服務端ws鏈接仍然會斷開鏈接

yifenbushe

問題描述

使用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)及workerman/webman等框架組件具體版本

操作系統(tǒng)ubuntu;
Workerman version:4.1.11
PHP version:8.1.2-1ubuntu2.13

1547 1 0
1個回答

latin

"每次收到、發(fā)送消息都會重新計時" 這個感覺會出現(xiàn)bug。如果服務端強制要求每55秒發(fā)一個心跳包,但是你延遲了下比如60秒才發(fā)送,那么連接可能就被服務端斷開了。

  • yifenbushe 2023-08-13

    但是發(fā)消息之后5分鐘一直都可以正常通信,斷開是在定時發(fā)送ping的過程

  • yifenbushe 2023-08-14

    而且刷新界面,重新建立鏈接,一個消息也不發(fā)的情況下,還是會自動斷開,只是斷開時間不一樣,有一個瀏覽器窗口400s斷開了,有一個500s+了還沒斷開,奇怪,感覺不穩(wěn)定,環(huán)境在虛擬機中,理論上不會是網絡的問題

  • yifenbushe 2023-08-14

    自己頂下帖子吧,有可能是瀏覽器原因,firefox就不會斷開,但是,chrome就會斷開,網上查詢可能對websocket處理機制不一樣,chrome發(fā)生心跳報文后,還需要接收到心跳報文才行,不然認為已斷開,求證?。?/p>

  • 小W 2023-08-14

    之前我也遇到過chrome瀏覽器沒有任何操作一段時間就會自動斷開,使用ws測試工具試一下

  • latin 2023-08-14

    那就gatewayWorker收到心跳返回一個數(shù)據(jù)試下唄

  • yifenbushe 2023-08-14

    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端。

  • yifenbushe 2023-08-14

    已解決:
    業(yè)務端處理心跳報文,并返回一個包,問題解決。

年代過于久遠,無法發(fā)表回答
??