Socket.IO - 房间
在每个命名空间内,你还可以定义Sockets可以加入和离开的任意通道。这些频道称为房间。房间用于进一步分离问题。房间也共享相同的 Sockets 连接,如命名空间。使用房间时要记住的一件事是它们只能在服务器端连接。
加入房间
你可以在Sockets上调用 join
方法以将 Sockets 订阅到给定的通道/房间。例如,让我们创建名为 ‘room- <room-number>‘的房间并加入一些客户。一旦这个房间满了,创建另一个房间并加入那里的客户。
注意 - 我们目前在默认命名空间中执行此操作,即 /
。你也可以以相同的方式在自定义命名空间中实现此功能。
要加入房间,你需要提供房间名称作为加入函数调用的参数。
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
app.get('/', function(req, res) {
res.sendfile('index.html');
});
var roomno = 1;
io.on('connection', function(socket) {
//Increase roomno 2 clients are present in a room.
if(io.nsps['/'].adapter.rooms["room-"+roomno] && io.nsps['/'].adapter.rooms["room-"+roomno].length > 1) roomno++;
socket.join("room-"+roomno);
//Send this event to everyone in the room.
io.sockets.in("room-"+roomno).emit('connectToRoom', "You are in room no. "+roomno);
})
http.listen(3000, function() {
console.log('listening on localhost:3000');
});
只需在客户端上处理此 connectToRoom
事件即可。
<!DOCTYPE html>
<html>
<head>
<title>Hello world</title>
</head>
<script src = "/socket.io/socket.io.js"></script>
<script>
var socket = io();
socket.on('connectToRoom',function(data) {
document.body.innerHTML = '';
document.write(data);
});
</script>
<body></body>
</html>
现在,如果你连接三个客户端,前两个将获得以下消息 -
You are in room no. 1
最后一个客户端将收到以下消息 -
You are in room no. 2
离开一个房间
要离开房间,你需要像调用 Sockets 上的 join
函数一样调用 leave
函数。
例如 - 要离开房间 room-1
,
socket.leave("room-"+roomno);