Abi*_*ell 25 javascript node.js socket.io
如何在socket.io中使用动态命名空间.
我正在寻找(可怜的)文档,它说必须像这样使用命名空间:
io.of('/news')
io.of('/akfda')
要使用命名空间io.of("/namespace")
.
我是否需要在服务器中注册每个命名空间?也许我想要一个动态内容的命名空间.
我该怎么做:
io.of('/:somethign/:id')
its*_*oma 32
Socket.IO支持'rooms'(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');
Run Code Online (Sandbox Code Playgroud)
服务器端:
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..');
});
Run Code Online (Sandbox Code Playgroud)
我希望这能帮到您!
bbu*_*lis 17
我会使用"房间"来支持您的动态内容.
服务器端
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);
Run Code Online (Sandbox Code Playgroud)
客户端
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);
....
Run Code Online (Sandbox Code Playgroud)
从版本开始,2.1.1
我能够使用它:
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
});
Run Code Online (Sandbox Code Playgroud)