簡體   English   中英

socketio客戶端默默地丟失連接並創建新套接字(傳輸關閉)

[英]socketio client silently loses connection and creates new socket (transport close)

我正在制作一個用ccapture錄制的threejs動畫

它取決於每個客戶端與節點后端的單一連接,后端接收“渲染幀”套接字事件。

這可以工作一段時間,但幾分鍾后,客戶端在沒有錯誤的情況下,以靜默方式關閉連接,然后創建一個新連接,從而丟失第一個初始套接字連接。 我保持窗戶打開整個時間和焦點。

我的套接字調試日志顯示以下內容。 它總是適用於幾個幀,但總是在一定但不一致的時間后下降:

socket.io:socket emitting event ["render-frame",{"frame":168}] +0ms
render frame
{ frame: 168 }
socket.io:client client close with reason transport close +6ms
socket.io:socket closing socket - reason transport close +0ms
socket.io:client ignoring remove for fbD1a4Wx0jBzJ7hqAAAA +1ms
SOCKET DISCONNECTED!

我在我的節點后端簡化了我的渲染幀監聽器以進行調試,現在它看起來像這樣:

io.on("connection", function (socket) {
    socket.on("disconnect", function (socket) {
        console.log("SOCKET DISCONNECTED!");
    });
    socket.on("render-frame", function (data) {
        console.log(data);
    });
});

這種情況在所有瀏覽器中都會發生,但我只需要它在chrome中工作。 使用socket.io 1.3.7

任何有關“運輸關閉”錯誤原因的幫助將不勝感激。

我想你應該看看這個問題: NodeJS + Socket.io連接是否丟棄/重新連接?

你的問題是套接字超時。 如果某個套接字上沒有活動,socket.io將自動關閉它。

一個簡單(和hackish)修復是向連接的客戶端發送心跳以創建活動並停止套接字超時。

服務器:

function sendHeartbeat(){
    setTimeout(sendHeartbeat, 8000);
    io.sockets.emit('ping', { beat : 1 });
}

io.sockets.on('connection', function (socket) {
    socket.on('pong', function(data){
        console.log("Pong received from client");
    });
}

setTimeout(sendHeartbeat, 8000);

客戶:

socket.on('ping', function(data){
    socket.emit('pong', {beat: 1});
});

似乎HackTimer.js和ccapture.js都用自定義函數替換window.setTimeout。 如果在任何其他JavaScript之前執行,HackTimer.js似乎可以正常工作。 對於ccapture.js,您可能希望嘗試確保它作為第一個腳本運行。 因此,SocketIO首先使用您的瀏覽器的本機setTimeout,然后被自定義的setTimeout吹走,它會破壞當前正在運行的任何計時器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM