我想做的事情如下:
var room = io.sockets.in('some super awesome room');
room.on('join', function () {
/* stuff */
});
room.on('leave', function () {
/* stuff */
});
这似乎不起作用。可能吗?
为了说明所需的行为:
io.sockets.on('connection', function (socket) {
socket.join('some super awesome room'); // should fire the above 'join' event
});
在Socket.IO中,“房间”实际上只是一个命名空间,可帮助您将巨大的插座袋过滤到较小的插座袋中。调用 io.sockets.in('room').on('something')
将导致事件处理程序触发 一切 事件发生时房间里的插座。如果这就是你想要的东西,这样的东西应该可以做到:
var room = io.sockets.in('some super awesome room');
room.on('join', function() {
console.log("Someone joined the room.");
});
room.on('leave', function() {
console.log("Someone left the room.");
});
socket.join('some super awesome room');
socket.broadcast.to('some super awesome room').emit('join');
setTimeout(function() {
socket.leave('some super awesome room');
io.sockets.in('some super awesome room').emit('leave');
}, 10 * 1000);
需要注意的重要一点是,如果您(1)获得一个房间中所有套接字的列表并且(2)迭代它们,则调用会产生相同的效果。 emit('join')
在各个。因此,您应确保您的事件名称足够具体,以免意外地将其发送到房间的“命名空间”之外。
如果你只想发射/消耗一个 单 当一个套接字加入或离开一个房间时,你需要自己写一个,因为一个房间不是一个“东西”就像它是一个“过滤器”。
我知道这个问题已经过时了,但是对于那些通过谷歌搜索偶然发现这个问题的人来说,这就是我接近它的方式。
即使没有加入或离开房间的本地事件,加入房间也很容易解释。
/* client.js */
var socket = io();
socket.on('connect', function () {
// Join a room
socket.emit('joinRoom', "random-room");
});
而对于服务器端
/* server.js */
// This will have the socket join the room and then broadcast
// to all sockets in the room that someone has joined
socket.on("joinRoom", function (roomName) {
socket.join(roomName);
io.sockets.in(roomName).emit('message','Someone joined the room');
}
// This will have the rooms the current socket is a member of
// the "disconnect" event is after tear-down, so socket.rooms would already be empty
// so we're using disconnecting, which is before tear-down of sockets
socket.on("disconnecting", function () {
var rooms = socket.rooms;
console.log(rooms);
// You can loop through your rooms and emit an action here of leaving
});
它们变得有点棘手的是当它们断开连接时,但幸运的是 disconnecting
事件被添加,发生在拆除房间里的插座之前。在上面的示例中,如果事件是 disconnect
然后房间会空着,但是 disconnecting
将拥有他们所属的所有房间。对于我们的例子,你将有两个插座将成为其中一部分的房间 Socket#id
和 random-room
我希望从我的研究和测试中指出其他人正确的方向。
您可以使用本机“disconnect”事件。
socket.on('disconnect', function () {
io.sockets.emit('user disconnected');
});