2012-03-02 23 views
16

He intentado con socket.io, encontré cuando carga la página html del cliente, se crea una nueva conexión de socket. Cuando actualizo la página, encontré una nueva conexión de socket creada y luego la conexión anterior se desconectó.¿Cómo evitar crear una nueva conexión de socket en socket.io después de actualizar la página html?

Mi problema es cómo evitar esto? Porque estoy construyendo una aplicación de sala de chat. Cuando un usuario ingresa a la página de la sala, en el lado del servier "conexión", se emite "¡Bienvenido, usuario xxx come!", Y en el evento "desconectar", se emite "User xxx leaved". Pero cuando un usuario actualiza la página actual, se activará el evento de 'desconexión' y se filtrará el evento 'conectado' nuevamente. Y emitirá "Bienvenido, usuario xxx come!" y "Usuario xxx con hojas". mensajes juntos.

¿Cómo ignorar el evento de actualización de página? ¿Y al igual que la sesión http?


actualización: Ya he encontrado manera de resolver el problema. a partir de esta pregunta Handle browser reload socket.io

Respuesta

19

No puede bloquear la actualización de la página, y no hay forma de evitar que socket.io se desconecte cuando un usuario actualiza la página.

que sugeriría la adición de un tiempo de espera:

  • Cuando se ve un usuario desconectar, se inicia un temporizador, dicen 10-30 segundos
  • Si un usuario vuelve a la charla mientras que el temporizador no ha terminado , no hacer nada
  • Si un usuario no ha regresado después de que termine el tiempo, a continuación, mostrar el "usuario ha dejado" mensaje
+0

¿Existe una solución 'similar a la sesión' para este problema? – qichunren

+3

Realmente no sé a qué te refieres con eso .. El socket del cliente está en el navegador, y cuando una página se recarga, todos los códigos JS del lado del cliente y el estado de esa página se descartan esencialmente. –

8

puede utilizar sesiones. A pesar de que el socket se desconecta cuando se realiza la actualización, aún podría retener algunos datos de ese usuario en particular y usar esos datos siempre que el socket esté conectado de nuevo.

Así es como se utiliza sesiones:

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}); 
}); 

y se debe utilizar el jade o cualquier otro "Vista del motor" para obtener los datos que se pasan a la página.

Cuestiones relacionadas