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);