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