2015-10-14 41 views
3

我的工作是記錄與ccapturesocketio客戶默默地失去連接,並創建新的socket(傳輸關閉)

這取決於每個客戶端有一個連接到節點的後端,其接收一個threejs動畫'render-frame'套接字事件。

這工作了一段時間,但幾分鐘後,客戶端沒有錯誤地關閉連接,然後創建一個新的連接,從而失去了第一個初始套接字連接。我始終保持整個時間的窗口開放,並將焦點放在上面。

我的套接字調試日誌顯示以下內容。它總是適用於幾幀,但一定但並不一致的時間後,總是滴:

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); 
    }); 
}); 

這是發生在所有的瀏覽器,雖然我只是真的需要它在鉻工作。使用socket.io 1.3.7

任何關於'運輸關閉'錯誤的原因將不勝感激。

+0

您運行客戶端的設備是什麼類型?任何可能的CPU或網絡連接節電問題? – jfriend00

+0

有同樣的問題,並建議添加一個乒乓球似乎是矯枉過正。這個問題似乎也只是'突然'發生(怎麼會是這樣?),它發生在1.3.5之後......然後將express和socket.io升級到最新版本,並繼續發生 – Clay

+0

Followup to my comment - 我正在使用'HackTimer'來解決我在Chrome中遇到的非活動標籤問題。我沒有將腳本放置在我的JavaScript文件的頂部,正如他們的文檔中所描述的那樣,毫不意外地導致了這種意外的行爲。 – Clay

回答

0

我想你應該看看這個問題:NodeJS + Socket.io connections dropping/reconnecting?

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

一個簡單的問題是,向連接的客戶端發送心跳信號以創建活動並停止套接字超時。

服務器:

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}); 
}); 
+0

默認情況下socketio有一個心跳...參數可以用pingTimeout和pingInterval進行修改。你可以在這裏閱讀https://github.com/socketio/engine.io ..此外,您可以在調試輸出中看到所有ping/pong請求:sudo DEBUG = engine:* node index.js – Clay

0

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