Pregunta

Estoy tratando de escribir una aplicación múltiple en Socket.io. El canal en el que se encuentra debe definirse por la URL en la que se encuentra. Si hago la parte de unión en la App.js con valores permanentes, todo funciona. Tan pronto como lo cambie para que la ruta para la ruta. La página realice la unión, obtengo el error, que los enchufes no están disponibles en el contexto. ¿Cuál sería la forma correcta para que pueda unir dinámicamente al canal?

/app.js

var io = socketio.listen(app);
require('./io')(io);

io.sockets.on('connection', function (socket) {  
  socket.on('debug', function (message) {
    socket.get('channel', function (err, name) {
      socket.in(name).broadcast.emit('debug', message);
    });
  });
});

/io.js

var socketio = function (io) { 
  if (!io) return socketio._io;  
  socketio._io = io;
} 

module.exports = socketio;

/routes/index.js

var io = require('../io')();
exports.page = function(req, res){
  var channel = req.params.id;
  res.render('page', { title: 'PAGE', channel: channel  });
  io.sockets.on('connection', function (socket) {
    socket.join(channel);
    socket.set('channel', channel );
  });
};
¿Fue útil?

Solución

La forma más fácil de hacer múltiples canales es de diferentes URL.

Por ejemplo, tengo al cliente que haga lo siguiente:

io.connect('/game/1')
io.connect('/system')

y en el servidor tengo

io.of('/game/1').on('connect' function(socket) {...})
io.of('/system').on('connect' function(socket) {...})

Parece que me estoy conectando dos veces aquí, pero Socket.io es lo suficientemente inteligente como para usar un solo websock para esta conexión (al menos lo dice en el uso de cómo hacer).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top