2012-03-05 5 views
8

Sto provando a configurare un server node.js, usando socket.io. Il problema che sto vedendo è che il mio server sta disconnettendo + ricollegando il client ogni 25 secondi.node.js sockets.io disconnettendo ogni ~ 25 secondi (relativo all'heartbeat)

Ecco il mio codice del server:

var io = require('socket.io').listen(5876); 
io.sockets.on('connection', function (socket) 
{ 
    console.log("New connection established"); 

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

mio client si connette utilizzando la distribuzione socket.io.js. A quanto ho capito (apparentemente in modo errato), ho bisogno che il mio client invii un "heartbeat" (un messaggio di ":: 2") ogni 15 secondi per impedire al server di pensare che la connessione sia morta e di scollegarla. In sostanza:

<script src="socket.io.js"></script> 
<script> 
    var socket = io.connect('http://localhost:5876'); 

    socket.on('connect', function(data) 
    { 
     console.log("Connected to server."); 
     setInterval(function() { socket.emit("::2"); console.log("sent heartbeat"); }, 15000); // schedule a heartbeat for every 15 seconds 
    }); 
</script> 

Ma il client è ancora sempre scollegato + ricollegato ogni 25 secondi (escluso il primo 25 secondi-tick).

Il log console del server node.js assomiglia a questo (potrebbe aver ritagliato alcune fasi collegare/scollegare anteriore identico, come è stato eco ogni 25 secondi):

New connection established 
    debug - emitting heartbeat for client 652791160849839915 
    debug - websocket writing 2:: 
    debug - set heartbeat timeout for client 652791160849839915 
    debug - got heartbeat packet 
    debug - cleared heartbeat timeout for client 652791160849839915 
    debug - set heartbeat interval for client 652791160849839915 
    info - transport end 
    debug - set close timeout for client 652791160849839915 
    debug - cleared close timeout for client 652791160849839915 
    debug - cleared heartbeat interval for client 652791160849839915 
A client has disconnected. 
    debug - discarding transport 
    debug - client authorized 
    info - handshake authorized 5961067041159055274 
    debug - setting request GET /socket.io/1/websocket/5961067041159055274 
    debug - set heartbeat interval for client 5961067041159055274 
    debug - client authorized for 
    debug - websocket writing 1:: 
New connection established 

Come posso fermare il mio server da scollegare + ricollegare il client ogni 25 secondi?

+0

per quanto ne so non avete bisogno di inviare manualmente pacchetti heartbeat come questo viene gestito da socket.io. Prova a verificare gli eventi di connessione e disconnessione dopo aver ritirato le tue chiamate a heartbeat manuali. – f0x

+0

hai mai risolto questo? \t sto avendo il problema esatto. Ho effettuato il downgrade a 0.8.7 e ho ancora lo stesso problema. timeout heartbeat debug per client 3744936361854682925 informazioni - debug di fine trasporto - imposta timeout chiusura per client 3744936361854682925 debug - tempo scaduto cancellato per client 3744936361854682925 –

+0

@PranoyC C'è una soluzione qui che potrebbe funzionare: https://github.com/socketio/socket .io/issues/777 A parte questo, ultimamente ho usato solo le versioni più recenti di socket.io e non ho avuto problemi. – Josh1billion

risposta

9

Si sta utilizzando l'ultima versione di socket.io, 0.9.1/0.9.1 -1? Se è così, questo è un problema noto confermato da Guillermo. La raccomandazione corrente è di ripristinare 0.9.0 o 0.8.7

https://github.com/LearnBoost/socket.io/issues/777

+0

Deve essere così; L'ho appena installato la scorsa notte, quindi è probabilmente l'ultima versione. Come posso tornare a 0.9.0? Ho installato utilizzando il metodo npm consigliato in questo modo: "npm install socket.io" – Josh1billion

+1

È possibile specificare una versione specifica da installare: npm install [email protected] – maroonmed

+0

Ah perfetto, grazie! – Josh1billion

2

non avete bisogno di inviare un battito cardiaco per mantenere la presa collegata, anche la sintassi di socket.emit è

  socket.emit('event_name',{"data"});