dynamic命名空间Socket.IO

我如何在socket.io中使用dynamic命名空间。

我正在寻找(贫穷的) 文档 ,它说,命名空间必须像这样使用:

io.of('/news')

io.of('/akfda')

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

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

我怎么能做这样的事情:

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

Socket.IO支持“房间”( https://github.com/LearnBoost/socket.io/wiki/Rooms ),你可以使用它来代替名字空间。 另外,当你需要dynamic的路线(你在你的应用程序中使用快递) – 最好的方法是使用从快递盒使用路线引擎。

然而,如果你仍然认为你需要socket.io中的命名空间的dynamic,这里是一个小例子,它是如何实现的:

用户端:

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

我希望这能帮到您!

我会用“房间”来支持你的dynamic内容。

服务器端

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

这是一种方法。 这里是我创build的一个socket.io子类来解决这个问题:

https://github.com/PencilCode/dynamic.io

该子类添加dynamic命名空间以及虚拟主机名支持(如果您愿意,每个主机都可以进入自己的名称空间树)。 回购有一些例子。

这是一个通用的socket.io侦听器,它侦听每个请求的命名空间,并为每个连接的套接字logging一条消息。 你可以听不同的正则expression式来听任何命名空间的子集。

它可以与标准的socket.io客户端库无任何修改。

 var DynamicServer = require('dynamic.io');
 io = DynamicServer({
     host:true,//启用虚拟主机处理
     publicStatus:true //启用/socket.io/status页面。
 });
 //可以设置任意数量的名称空间模式。
 //这是一个单一的catch-all模式的例子。
 io.setupNamespace(/.*/,function(nsp){
     nsp.on('connect',函数(socket){
         console.log('套接字连接',nsp.fullname());
     });
     nsp.expire(function(){
         console.log(nsp.fullname(),'is expired');
     });
 });
 io.listen(8888);

服务器

 var MAX_CLIENTS = 5; var namespace_queue = []; function searchObjectOnArray(nameKey, myArray) { for (var i = 0; i < myArray.length; i++) { if (myArray[i].id === nameKey) { return myArray[i]; } } } function createNamespace(data){ var ns = { //id: require('node-uuid')(), id : data.name, clients: 0, }; namespace_queue.push(ns); return ns; } createNamespace({name: 'primer'}); io.of('').on('connection', function(socket){ console.log('-' + socket.id); /// Welcome to the new client socket.emit('Welcome', {SocketId : socket.id}); socket.on('JoinToApp', function (data, callback) { var namespaceToConnect = searchObjectOnArray(data.namespace, namespace_queue) if(namespaceToConnect.clients <= MAX_CLIENTS){ var dynamicNamespace = io.of('/' + namespaceToConnect.id); dynamicNamespace.on('connection', function(ns_socket){ console.log('user connected to ' + namespaceToConnect.id); dynamicNamespace.emit('hi', 'everyone!'); }); namespaceToConnect.clients++; } callback({namespaces:namespace_queue}); }) socket.on('createNamespace',function(data,join_cb){ createNamespace(data); join_cb({message:'Namespace created'}); }); }); 

客户

 <input id="namespaceInput" type="text" placeholder="New namespace name"> <input id="namespaceToConnect" type="text" placeholder="namespace to connect"> <button onclick="javascript: createNamespace()">Create Namespace</button> <button onclick="javascript: joinToNamespace()">Connect to Namespace</button> <script src="https://cdn.socket.io/socket.io-1.4.5.js"></script> <script> var socket = null; (function(){ socket = io.connect('http://localhost:3000/'); })() function createNamespace(){ var namespaceName = document.getElementById("namespaceInput").value; socket.emit('createNamespace', {name : namespaceName}, function(data){ alert(data.message); }) } function joinToNamespace(){ var name = document.getElementById("namespaceToConnect").value; socket.emit('JoinToApp', {namespace: name}, function(data){ console.log('Namespaces created:'); console.log(data) var ns_socket = io.connect('http://localhost:3000/' + name); ns_socket.on('connect',function(){ console.log('joined namespace ' + name); }); ns_socket.on('hi', function(data){ console.log('hi ' + data) }) }); } </script> 

更多详情: https : //ingcamilorodriguez.wordpress.com/2016/06/21/como-hacer-namespaces-dinamicos-en-socket-io/