![](/img/trans.png)
[英]socket.io: Disconnect event - 'transport close', 'client namespace disconnect', 'transport error' and 'forced close'
[英]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.