2016-07-29 138 views
0

我使用Socket.io在手機和網頁之間進行一些通信,並且我遇到了服務器不斷丟失連接的問題。我看到很多其他人發佈了關於Socket.io的連接,其中的連接在空閒大約5分鐘左右後下降,但是這是一種連接,具有不斷的信息來回發送,而且我已經能夠保持連接約30秒。使用Socket.io,連接不斷下降

服務器端代碼我跑的是:

var app = require('express')(); 
var http = require('http').Server(app); 
var io = require('socket.io')(http); 

io.on('connection', function(socket){ 

    socket.on('create', function (room) { 
     socket.join(room); 
    }); 

    socket.on('player-move', function(msg){ 
     roomId = msg['room']; 
     move = msg['action']; 
     socket.broadcast.to(roomId).emit('player-move', move); 
    }); 

    socket.on('disconnect', function() { 
     console.log('someone has disconnected'); 
    }); 

}); 

http.listen(443, function(){ 
    console.log('listening on *:443'); 
}); 

的客戶端是非常基本的發出事件。這裏有一個例子:

$("#arrow-left").on("touchstart", function(){ 
    var senddata = { "room": roomId, "action": "d-l" }; 
    socket.emit("player-move", senddata); 
}); 

一切似乎都運行良好,直到一切開始後5-30秒,然後連接剛剛下降。連接通常會再次啓動,但5-10秒後。有沒有人有類似的問題發生?這可能是服務器而不是代碼的問題嗎?我之前在使用Socket.io的不同服務器上做過類似的事情,並沒有遇到這種連接問題。任何幫助或方向進去,將不勝感激。謝謝!

+0

你的服務器的'var'聲明在哪裏? 'roomId =','move ='會在全局範圍內以非嚴格模式定義這些變量,並且會嚴格地以嚴格模式崩潰你的服務器。客戶在哪裏獲得'roomId'?如果它是未定義的,也可能會導致服務器崩潰,因爲你基本上是在告訴服務器運行'socket.broadcast.to(undefined).emit(...);' –

+0

客戶端和服務器之間是否有任何基礎架構可能會計時out socket?你確定你的服務器不斷運行,而不是重新啓動嗎? – jfriend00

+0

你確定他們正在斷開嗎?連接也可能回退到長輪詢,而不是持續連接,這可能由於各種原因而發生,並且可能看起來像沒有連接。 – pay

回答

0

我與另一個庫ws有同樣的問題,我試圖通過刪除客戶端數組發送斷開連接請求的特定客戶端正確處理斷開方法。我不完全知道如何,但它解決了我的問題。

clients = [] 

io.on('connection', function(socket){ 
    clients.push(socket); 

    // above methods 

    socket.on('disconnect', function(){ 
     console.log("disconnected"); 
     deleteFromArray(clients, socket.id); 

    }); 
}); 

function deleteFromArray(arr, element) { 
    position = arr.indexOf(element); 
    arr.splice(position, 1); 
}