2012-03-02 10 views
16

Ho provato socket.io, ho trovato quando si caricava la pagina html del client, una nuova connessione socket creata. Quando aggiorno la pagina, ho trovato una nuova connessione socket, quindi la vecchia connessione disconnessa.Come evitare di creare una nuova connessione socket in socket.io dopo l'aggiornamento della pagina html?

Il mio problema è come evitare questo? Perché sto costruendo un'applicazione per chat room. Quando un utente accede alla pagina della sala, sul lato "connessione" emette "Benvenuto utente xxx vieni!", E su evento "disconnec" emette "Utente xxx leaved". Ma quando un utente aggiorna la pagina corrente, questo attiverà di nuovo l'evento 'disconnetti' e l'evento 'connesso'. Ed emetterà "Benvenuto utente xxx vieni!" e "Utente xxx lasciato". messaggi insieme.

Come ignorare l'evento di aggiornamento della pagina? E proprio come la sessione http?


Aggiornamento: ho già trovato modo per risolvere il problema. da questa domanda Handle browser reload socket.io

risposta

19

Non è possibile bloccare l'aggiornamento della pagina e non è possibile evitare la disconnessione di socket.io quando un utente aggiorna la pagina.

vorrei suggerire di aggiungere un timeout:

  • Quando un utente si vede disconnessione, avviare un timer, diciamo 10-30 secondi
  • Se un utente ritorna alla chiacchierata mentre il timer non finito , non fare nulla
  • Se un utente non è tornato dopo la fine del timer, quindi visualizzare il "utente ha lasciato" un messaggio
+0

Esiste una soluzione "simile alla sessione" per questo problema? – qichunren

+3

Non so davvero cosa intendi per questo .. Il socket del client si trova nel browser e quando una pagina viene ricaricata, tutto il codice JS sul lato client e lo stato per quella pagina vengono sostanzialmente eliminati. –

8

è possibile utilizzare le sessioni. Anche se il socket si disconnette quando si verifica l'aggiornamento, è possibile conservare alcuni dati di quell'utente particolare e utilizzare tali dati ogni volta che si connette nuovamente il socket.

Ecco come si utilizza sessioni:

var express = require('express');  
var MemoryStore = require('express').session.MemoryStore; 

app.use(express.cookieParser()); 
app.use(express.session({ secret: "keyboard cat", store: new MemoryStore({ reapInterval: 60000 * 10 })})); 

app.get('/', function(req,res){ 
    req.session.name ="clients_name"; 
    res.render(__dirname + '/index.jade',{user:req.session.name}); 
}); 

e si dovrebbe utilizzare giada o di qualsiasi altro "View Engine" per ottenere i dati passati alla pagina.

Problemi correlati