Saltar al contenido

Espacios de nombres dinámicos Socket.IO

Solución:

Socket.IO admite ‘habitaciones’ (https://github.com/LearnBoost/socket.io/wiki/Rooms), puede usarlo en lugar de espacios de nombres. Además, cuando necesita rutas dinámicas (y usa express en su aplicación), la mejor manera es usar use route-engine desde express box.

  • La mejor manera de hacer enrutamiento dinámico con Express.js (node.js)
  • Usando rutas en Express-js
  • http://expressjs.com/api.html#app.routes
  • http://shtylman.com/post/expressjs-re-routing/
  • http://jordanhoff.com/post/22602013678/dynamic-express-routing

Sin embargo, si todavía cree que necesita dinámica en los espacios de nombres en socket.io, aquí hay un pequeño ejemplo de cómo se puede implementar:

Lado del usuario:

var connect = function (ns) {
    return io.connect(ns, {
       query: 'ns="+ns,
       resource: "socket.io"
    });
}

var socket = connect("/user/12');

Lado del servidor:

var url = require('url');
  , ev = new events.EventEmitter()

// <ns name>: <ns regexp>
var routes = {
  // /user/:id
  'user': '^\/user\/(\d+)$',

  // /:something/:id
  'default': '^\/(\w+)\/(\d+)$'
};

// global entry point for new connections
io.sockets.on('connection', function (socket) {
  // extract namespace from connected url query param 'ns'
  var ns = url.parse(socket.handshake.url, true).query.ns;
  console.log('connected ns: '+ns)

  //
  for (var k in routes) {
    var routeName = k;
    var routeRegexp = new RegExp(routes[k]);

    // if connected ns matched with route regexp
    if (ns.match(routeRegexp)) {
      console.log('matched: '+routeName)

      // create new namespace (or use previously created)
      io.of(ns).on('connection', function (socket) {
        // fire event when socket connecting
        ev.emit('socket.connection route.'+routeName, socket);

        // @todo: add more if needed
        // on('message') -> ev.emit(...)
      });

      break;
    }
  }

  // when nothing matched
  // ...
});

// event when socket connected in 'user' namespace
ev.on('socket.connection route.user', function () {
  console.log('route[user] connecting..');
});

// event when socket connected in 'default' namespace
ev.on('socket.connection route.default', function () {
  console.log('route[default] connecting..');
});

¡Espero que esto ayude!

Usaría “salas” para respaldar su contenido dinámico.

Lado del servidor

var server = require('http').createServer(),
    io     = require('socket.io')(server);


io.on('connection', function(socket){

  var room = socket.handshake['query']['r_var'];

  socket.join(room);
  console.log('user joined room #'+room);

  socket.on('disconnect', function() {
    socket.leave(room)
    console.log('user disconnected');
  });

  socket.on('chat message', function(msg){
    io.to(room).emit('chat message', msg);
  });

});

server.listen(3000);

Lado del cliente

var socket_connect = function (room) {
    return io('localhost:3000', {
        query: 'r_var="+room
    });
}

var random_room = Math.floor((Math.random() * 2) + 1);
var socket      = socket_connect(random_room);

socket.emit("chat message', 'hello room #'+random_room);
....

A partir de la versión 2.1.1 Pude hacer que funcionara con esto:

wss.of((nsp, query, next) => {
  const { token } = query;

  // Do your authentication or whatever here...

  // If success
  next(null, true);

}).on('connect', (socket) => {
  // socket connected to your namespace
});
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *