javascript - 动态命名空间 Socket.IO

标签 javascript node.js socket.io

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

我正在寻找(可怜的)documentation ,并且它说必须像这样使用命名空间:

io.of('/news')

io.of('/akfda')

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

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

我该怎么做:

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

最佳答案

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

但是,如果您仍然认为在 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..');
});

希望对你有帮助!

关于javascript - 动态命名空间 Socket.IO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13143945/

相关文章:

javascript - Reveal.js 多路复用不起作用

javascript - 无法连接到 ejs 文件上的套接字、引用和 io 未定义错误

javascript - 如何对数组 : jQuery 中的元素进行排序

javascript - 点击功能中的 sencha touch HTMLDivElement

javascript - 如何在形成 javascript 对象时删除引号?

html - 使用 Jade 呈现的 HTML 值中的额外空格

javascript - 在node.js中导出模块

javascript - 未拾取标记位置 - Google Maps API v3

python - 在 Openshift 上使用 node-gyp 构建模块

Heroku 上的 Node.js Socket.io 抛出 H13