我在我的应用程序中使用socket.io包含一对一的实时消息传递功能,并且需要确保客户端一次只能存在于一个房间中。当用户关闭聊天区域时,我正在调用一个函数,该聊天区域向服务器发出请求,我正在使用socket.leave从客房中删除客户端。然而,当我然后加入另一个房间时,客户端也重新加入前一个房间,并且只能向前一个房间发送消息。希望以下代码能够帮助证明我正在努力实现的目标以及我将如何实现它。
客户端
用户通过点击朋友列表中的图标加入会议室。这会将唯一的聊天ID传递给以下的joinRoom函数。
var joinRoom = function(id) {
var room = id;
socket.emit('join', {room: room});
};
当用户关闭聊天区域时,他们会使用相同的ID调用以下的leaveRoom函数。
var leaveRoom = function(id) {
var room = id;
socket.emit('leave', {room: room});
};
服务器
在服务器端,我有以下内容。
socket.on('join', function(data) {
socket.join(data.room);
rooms[userId] = data.room;
console.log(rooms);
socket.on('leave', function(data) {
socket.leave(data.room);
delete rooms[userId];
console.log(rooms);
您可以从上面看到,我还在用户加入时将会话ID和房间/聊天ID添加到rooms
对象,并在他们离开时将其删除(控制台按预期记录)。
我一直在使用io.sockets.client()
跟踪房间,如果用户1和用户2加入房间,我会得到以下输出,然后用户1离开该房间并与用户3加入一个房间。
'580119d779dfb394926ffad2':
Room {
sockets:
{ '/#7GkyyIz7eINlls_1AAAD': true,
'/#fIefLQfX-VPNp9HFAAAC': true },
length: 2 },
'58011b4679dfb394926ffad3':
Room {
sockets:
{ '/#7GkyyIz7eINlls_1AAAD': true,
'/#QTxr85JsDbbgfUSdAAAE': true },
length: 2 } }
上面告诉我,用户1最终进入两个房间,这表明他们没有完全离开第一个房间。
过去两天我一直试图解决这个问题而且找不到答案,所以任何帮助都会受到赞赏。