WebSocket房间管理怎么避免用户重复加入同一个房间?
我用WebSocket做了一个多人聊天室,但发现用户刷新页面后会重复加入同一个房间,导致消息重复接收。我已经在服务端用Set存用户ID了,但好像没起作用?
下面是我服务端处理加入房间的逻辑:
const rooms = new Map();
function joinRoom(userId, roomId) {
if (!rooms.has(roomId)) {
rooms.set(roomId, new Set());
}
rooms.get(roomId).add(userId); // 这里是不是有问题?
}
看一下 WebSocket 的生命周期,连接断开时需要显式处理。ws库的话,监听
close事件:另外还有个问题:刷新页面时新旧连接会短暂共存,这期间可能收到重复消息。可以在 joinRoom 里先检查一下:
不过更规范的做法是用 WebSocket 连接本身的 ID(或者 session)来区分不同连接,而不是 userId。因为一个用户可能多设备登录,或者刷新页面时新旧连接并存的情况。
官方文档里关于 ws 的 Connection handling 章节有提到,建议在
connection事件里就做好这个映射关系,把每个 socket 对应的 userId 存起来,断开时才能准确清理。