动态命名空间 Socket.IO

新手上路,请多包涵

如何在 socket.io 中使用动态命名空间。

我正在查看(糟糕的) 文档,它说必须像这样使用名称空间:

io.of('/news')

io.of('/akfda')

要使用命名空间,您需要执行 io.of("/namespace")

我需要在服务器中注册每个命名空间吗?也许我想要一个用于动态内容的命名空间。

我该怎么做:

io.of('/:somethign/:id')

原文由 Abimael Martell 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 621
2 个回答

Socket.IO 支持“房间”( https://github.com/LearnBoost/socket.io/wiki/Rooms ),您可以使用它代替命名空间。此外,当您在路线中需要动态时(并且您在应用程序中使用快递) - 最好的方法是使用快递箱中的路线引擎。

但是,如果您仍然认为在 socket.io 的命名空间中需要动态,这里是一个如何实现它的小例子:

用户端:

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

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

服务器端:

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

我希望这能帮到您!

原文由 itspoma 发布,翻译遵循 CC BY-SA 3.0 许可协议

我会使用“房间”来支持您的动态内容。

服务器端

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

客户端

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

原文由 bbullis 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏