我正在尝试查找客户端当前在断开连接事件中所在的房间列表(关闭浏览器/重新加载页面/互联网连接已断开)。
我需要它的原因如下:用户已进入几个房间。然后其他人也做了同样的事情。然后他关闭了浏览器选项卡。我想通知他所在房间里的所有人他离开了。
所以我需要在“断开连接”事件中做一些事情。
io.sockets.on('connection', function(client){
...
client.on('disconnect', function(){
});
});
我已经尝试了两种方法,发现它们都是错误的:
1)迭代adapter.rooms
.
for (room in client.adapter.rooms){
io.sockets.in(room).emit('userDisconnected', UID);
}
这是错误的,因为适配房包含所有房间。不仅仅是我的客户所在的房间。
2)正在经历client.rooms
。这会返回客户端所在房间的正确列表,但不会返回断开连接事件。断开连接时此列表已为空[]
.
那么我该怎么做呢?在撰写本文时,我正在使用最新的 socket.io:1.1.0
默认情况下这是不可能的。看一下socket.io的源代码。
那里有你的方法Socket.prototype.onclose
这是在之前执行的socket.on('disconnect',..)
打回来。所以在那之前所有的房间都被留下了。
/**
* Called upon closing. Called by `Client`.
*
* @param {String} reason
* @api private
*/
Socket.prototype.onclose = function(reason){
if (!this.connected) return this;
debug('closing socket - reason %s', reason);
this.leaveAll();
this.nsp.remove(this);
this.client.remove(this);
this.connected = false;
this.disconnected = true;
delete this.nsp.connected[this.id];
this.emit('disconnect', reason);
};
一个办法could要么破解 socket.js 库代码,要么覆盖此方法,然后调用原始方法。我很快就测试了它似乎有效:
socket.onclose = function(reason){
//emit to rooms here
//acceess socket.adapter.sids[socket.id] to get all rooms for the socket
console.log(socket.adapter.sids[socket.id]);
Object.getPrototypeOf(this).onclose.call(this,reason);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)