我怎么能拒绝一些用户joinsocket.io中的同一个房间?

现在我使用express4和socket.io 0.9build立在线聊天室。问题是我不希望同一个用户join同一个房间,当他们打开另一个浏览器(或其他浏览器)的标签。我可以得到用户会话(要访问这些房间,用户必须login,当他们login时,“uid”将设置到会话中)。

什么显然是你的问题? 您无法访问房间中的当前用户? 如果是这样,你可以从这样一个房间的sockets,然后检查你的用户。

首先添加一个参数到您的第一个套接字,以便以后能够识别。

socket.sessionid=your_user_session_id; 

然后,对于每一个连接,如果你已经有一个带有这个会话ID的套接字,检查房间的套接字

 var socketsOfTheRoom = io.sockets.clients(your_room_name); for(var i=0;i<socketsOfTheRoom.length;i++){ sock = socketsOfTheRoom[i] if(sock===sessionid_of_new_connection){ return true } } return false 

在@Jujuleder的帮助下,我想出了如何解决我的问题。

服务器:

 var socketio = require('socket.io'), cookieParser = require('cookie-parser')('YOUR-SERECT-KEY'), session = require('express-session'), RedisStore = require('connect-redis')(session), redis = require("redis"), client = redis.createClient(6379, "127.0.0.1"), store = new RedisStore; module.exports.listen = function(app){ var io = socketio.listen(app); var pubRoom = new PublicRoom(io); pubRoom.listen(); return io }; function PublicRoom(io){ this._baseUrl = '/room/public/'; this.publicRoom = io.of(this._baseUrl); } PublicRoom.prototype.listen = function(){ this.publicRoom.authorization(function(handshakeData, callback){ function cookieParserWrapper (handshakeData, next) { cookieParser(handshakeData,{}, next); } cookieParserWrapper(handshakeData,function(){}); var sid = handshakeData.signedCookies.sid; //get the UID from redis store.get(sid,function(err,data){ if(err){ console.log(err); }else{ handshakeData.uid = data.uid;//set UID into handshake callback(null, true); } }); }); this.publicRoom.on('connection', function(socket){ socket.on('authReq',function(room,user){ socket.myID = user; var uid = socket.handshake.uid; // We can get the UID here. var onlineUsers = self.publicRoom.clients(room);//get users in this room if(onlineUsers.length === 0){ socket.to(room).emit('authRes',true);// Tell the client you can Join socket.auth = true; }else{ for(var i= 0,l=onlineUsers.length;i<l;i++){ if(onlineUsers[i].myID===uid){ socket.auth = false; socket.to(room).emit('authRes',false); // Tell the client you can't Join }else{ socket.auth = true; socket.to(room).emit('authRes',true);// Tell the client you can Join } } } }); }); } 

客户:

 socket.on('connect', function() { socket.emit('authReq',roomID,userID); }); 

//SERVER.JS

 socket.on('authReq',function(room,user, callback){ if (io.nsps['/'].adapter.rooms[room]) { var onlineUsers = io.sockets.adapter.rooms[room].sockets; var totalUsers = io.sockets.adapter.rooms[room]; if(totalUsers.length === 0){ callback(true); } else { var userinroom = []; for (var id in onlineUsers) { if (io.of('/').adapter.nsp.connected[id].username==user) userinroom.push(user); } if (userinroom.length==0) callback(true); else callback(false); } } else callback(true); }); 

// CLIENT.JS

 socket.emit('authReq',roomname,username, function(callback) { if(callback) if (username) socket.emit('adduser', username, rooname); });