Socket.io 是一个跨浏览器实时通讯库,它为前端实现了实时通讯功能。在实际开发中,我们有时需要对通讯进行限制,比如限制房间的最大人数。本文将介绍如何使用 Socket.io 实现房间人数限制。
实现思路
Socket.io 最基本的使用方式是将一个客户端连接到一个命名空间,通常表现为一个房间。在一个简单的场景下,我们可以通过判断命名空间中客户端数量来限制房间人数。但在多进程或者多服务器的情况下,这一方式显然不够稳定,因此我们需要另外的实现思路。
一种可行的思路是在服务端维护一个房间状态的表,当一个客户端连接时,首先向服务端发送加入房间的请求,并将客户端 ID 和房间信息存储在当前服务端节点的压缩状态表中。同时在客户端监听房间人数的变化,当人数达到上限时,告诉客户端此时无法加入房间,避免客户端多次请求。
实现代码
下面是一个简单的实现代码,仅供参考。你可以根据自己的需求对代码进行扩展和改进。
// www.javascriptcn.com code example
// 服务端代码
io.on('connection', function(socket){
socket.on('join', function(room){
const clients = io.sockets.adapter.rooms.get(room);
// 如果房间没有被创建则初始化
if (!clients) {
io.sockets.adapter.rooms.set(room, {clients: new Set()});
}
const roomObj = io.sockets.adapter.rooms.get(room);
if (roomObj.clients.size < 10) { // 限制人数为 10
// 将客户端 ID 存储到当前服务端节点的状态表中
roomObj.clients.add(socket.id);
// 将客户端添加进房间中
socket.join(room, function() {
// 发送加入房间成功的消息到客户端
socket.emit('joined', {
message: '加入房间成功',
room: room
});
});
} else {
// 房间已满,向客户端发送房间已满的消息
socket.emit('full', {
message: '房间已满,无法加入',
room: room
});
}
});
socket.on('disconnect', function(reason){
// 房间人数更新,从状态表中移除客户端 ID
const rooms = io.sockets.adapter.rooms.keys();
for (const room of rooms) {
const roomObj = io.sockets.adapter.rooms.get(room);
if (roomObj.clients.delete(socket.id)) {
io.to(room).emit('leave', {
message: '有人退出了房间',
room: room
});
}
}
});
});
// 客户端代码
socket.on('connect', function() {
const room = 'room1';
socket.emit('join', room);
});
socket.on('joined', function(data) {
console.log(data.message); // 加入房间成功
});
socket.on('full', function(data) {
console.log(data.message); // 房间已满,无法加入
});
socket.on('leave', function(data) {
console.log(data.message); // 有人退出了房间
});指导意义
Socket.io 的房间功能为我们实现实时通讯提供了便捷的工具。本文介绍了如何通过服务端状态表的方式限制房间人数,同时提供了示例代码。在实际开发中,我们还可根据具体场景对代码进行改进和扩展。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67d65fc6a941bf7134c1aa0b