Rooms 是 Socket.io 提供的一種「伺服器端專屬」的虛擬群組機制。前端完全不知道房間的存在,一切的分組邏輯都由後端控制。一個 Socket 可以同時加入多個房間,也可以隨時退出。
核心語法:
socket.join('room_name'):將該客戶端加入指定房間。socket.leave('room_name'):將該客戶端移出指定房間。io.to('room_name').emit(...):對該房間內的所有人(包含自己)廣播。socket.to('room_name').emit(...):對該房間內的所有人廣播,但不包含自己。實作範例:專屬聊天室
io.on('connection', (socket) => {
// 監聽前端發出的加入房間請求
socket.on('join_room', (roomName) => {
socket.join(roomName);
console.log(`Socket ${socket.id} 加入了房間:${roomName}`);
// 歡迎該名使用者 (只發給剛進來的這位)
socket.emit('system_msg', `成功加入 ${roomName} 房間!`);
// 通知房間裡的其他所有人
socket.to(roomName).emit('system_msg', `有新成員加入 ${roomName} 囉!`);
});
// 監聽前端在房間內發送訊息
socket.on('room_message', (data) => {
const { room, message } = data;
// 將訊息精準廣播給該房間的所有人
io.to(room).emit('receive_message', {
sender: socket.id,
text: message
});
});
});
如果說 Rooms 是同一棟大樓裡的不同「會議室」,那 Namespaces 就是完全不同的「兩棟大樓」。
當你的專案非常龐大,例如有一個給一般使用者的端點 /chat,和一個給管理員專用的監控端點 /admin,我們就會使用 Namespace 來徹底隔離兩邊的邏輯與事件名稱。
核心語法:
/(也就是我們前面一直在用的 io.on)。io.of('/your-namespace')。實作範例:管理員專屬通道
// 建立一個給一般使用者的 Namespace
const chatNsp = io.of('/chat');
chatNsp.on('connection', (socket) => {
console.log('一般使用者連線到 /chat');
// 這裡的廣播只會發給 /chat 底下的人
chatNsp.emit('welcome', '歡迎來到一般聊天區');
});
// 建立一個給管理員的 Namespace
const adminNsp = io.of('/admin');
// 你可以針對特定 Namespace 加入專屬的中介軟體 (例如驗證管理員 Token)
adminNsp.use((socket, next) => {
const token = socket.handshake.auth.token;
if (token === 'super-secret-admin-token') {
next();
} else {
next(new Error('驗證失敗,你不是管理員!'));
}
});
adminNsp.on('connection', (socket) => {
console.log('管理員連線到 /admin');
adminNsp.emit('alert', '系統警告:伺服器負載過高!');
});
靈活運用這兩個機制,你就能在 Node.js 中打造出足以支撐萬人同時在線,且頻道互不干擾的即時通訊巨獸!