目前,我有一个房间的发起人标记为“主持人”。 我需要设置它,以便如果“主持人”点击“关闭房间”链接,它将断开所有用户与该房间ID的连接。
我如何从socket.manager.roomClients
或类似的东西中获取所有用户,如果“主机”的room_id与套接字管理器中的密钥匹配,则遍历它们并运行某种类型的socket.leave( room_id )
? / p>
感谢您的任何见解或帮助。如果我需要澄清任何内容,请告诉我。
答案 0 :(得分:7)
在socket.io中似乎没有这种机制,但是自己实现它并不是非常困难。您只需遍历房间中的每个套接字并调用disconnect方法。理想情况下,这应该是一个io.sockets级别的方法,但你必须知道套接字正在使用的命名空间,所以我在套接字级别添加了一个原型来引导每个人进入一个房间。看看以下内容:
var sio = require('socket.io');
var io = sio.listen(app);
sio.Socket.prototype.disconnectRoom = function (name) {
var nsp = this.namespace.name
, name = (nsp + '/') + name;
var users = this.manager.rooms[name];
for(var i = 0; i < users.length; i++) {
io.sockets.socket(users[i]).disconnect();
}
return this;
};
您可以使用它,如下所示。
socket.on('hostdisconnect', function() {
socket.disconnectRoom('roomName');
});
警告一句,如果您打算使用类似的东西,重要的是要注意它使用的内部数据结构可能会或可能不会出现在socket.io的下一个版本中。 socket.io的更新可能会破坏此功能。
答案 1 :(得分:0)
经过尝试通过socket.io进行了多次斗争后,我找到了通过Node.JS / Express来杀死房间的方法
app.get('/disconnect', function(req, res){
console.log("Disconnecting Room " + req.session.room_id);
req.session.destroy(function(err){
if (err){
console.log('Error destroying room... ' + err);
} else{
res.redirect('/');
}
});
});
答案 2 :(得分:0)
socket.io中的最新更新是leave()方法,作为join()的伴侣。
例如
socket.join('room1');
socket.leave('room1');
在您的方案中可能会帮助您。
答案 3 :(得分:0)
这是我在socket.io "version": "2.1.1"
中设法做到这一点的方法:
function disconnectRoom(room: string, namespace = '/') {
io.of(namespace).in(room).clients((err, clients) => {
clients.forEach(clientId => this.io.sockets.connected[clientId].disconnect());
});
}