Domanda

Sto provando a scrivere un'applicazione multicanale in socket.io. Il canale si è in dovrebbe essere definito dall'URL ci si trova. Se faccio la parte che unisce alle app.js con i valori permanenti tutto funziona. Appena ho modificarlo in modo che il percorso per route.page fa l'unione ottengo l'errore, che le prese non sono disponibili nel contesto. Quale sarebbe il modo corretto in modo che possa unire dinamicamente il canale?

/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 );
  });
};
È stato utile?

Soluzione

Il modo più semplice che ho trovato per fare più canali è fuori di URL diversi.

Per esempio io ho il cliente effettuare le seguenti operazioni:

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

e sul server ho

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

Sembra che io sto collegando due volte qui, ma socket.io è abbastanza intelligente per utilizzare un unico websocket per questa connessione (almeno si dice così in modo da usare).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top