2015-09-15 5 views
5

Stavo lavorando con socket.io v1.3.6 (nodejs) e ho cercato di emettere i dati dal browser utilizzando il codice seguente.socket.io emette quando il server è offline

Codice Cliente

var socket = io.connect('http://something.com:3300/'); 
 
function sendMessage(message) { 
 
\t socket.emit('message', message);  
 
}

Codice Server

var io = require('socket.io').listen(3300); 
 

 
io.sockets.on('connection', function (socket) { 
 
    messageHandler(socket); 
 
}); 
 

 
function messageHandler(socket) { 
 
    socket.on('message', function (data) { \t 
 
\t console.log('Captured a message : ' + data); \t 
 
    }); 
 
}

mio server presa http://something.com:3300/ è giù inizialmente, e ha cercato di chiamare alcuni sendMessage() - (diciamo circa 10 chiamate)

Come previsto nel browser io ottenere l'errore di handshake nel registro della console.

Ho aspettato 5 minuti e ho avviato il server socket.

Ma sorprendentemente tutti i messaggi inviati in modalità offline vengono acquisiti nel server, una volta stabilita l'handshake.

Le mie domande: 1) Questa logica offline è parte delle specifiche di socket.io o WebSocket? 2) Ho cercato un sacco di domande su socket.io in modalità offline e ho visto alcuni consigli di gestione speciali per acquisire messaggi offline. Ma come funziona senza quegli speciali controlli offline?

risposta

4

Sì, c'è un buffer 'non in linea' per i pacchetti per essere emessa prima del primo collegamento, vedere qui la realizzazione di socket.js te:

https://github.com/socketio/socket.io-client/blob/master/lib/socket.js

(especiall controllare onConnect e emitBuffered funzioni/attribs)

+0

Grazie che spiega bene! Quando onconnect, emetterà tutti i dati in emitBuffers ... Lo rende affidabile finché il browser rimane aperto. – Shabeel

+0

Bene, potresti accettare la mia risposta? Sono felice di aiutare :) – gabowsky

2

ho risolto questo problema con questo piccolo cambiamento sulla riconnessione:

mySocket.on('reconnect', function() { 

    //Avoid that buffered emits getting send again 
    mySocket.sendBuffer=[]; 

    ... 
}); 

impostando t invia sendBuffer a un array vuoto per evitare di inviare nuovamente i pacchetti su riconnettersi. Ovviamente dovresti gestire i tentativi di invio da solo.