即使客户端已经离开房间,socket.io消息仍然被广播

时间:2013-07-15 10:51:43

标签: javascript socket.io

我整理了一个人们可以加入/离开房间的聊天应用程序。我遇到了一些非常奇怪的事情,我真的无法理解它。

这是我的server.js(后端)的摘录:

client.on("send", function(msg) {
  console.log("Sending to ==> " + client.room);
  if ('undefined' !== typeof client.room) {
    socket.sockets.in(client.room).emit("chat", people[client.id], msg);
  }
});

我基本上是“强迫”人们加入一个房间(如果他们不在房间里,则客户。房间返回未定义。)

我在前端放置了两个按钮,一个用于加入房间,另一个用于离开房间。加入按钮通过以下方式处理:

client.on("joinRoom", function(name) {
  client.join(name); //where name is the name of the room coming from the frontend
 }

休假室功能如下:

client.on("leaveRoom", function(name) {
  client.leave(name);
}

现在,问题是:在client.leave(name)之后;用户仍然可以发送消息和console.log(“发送到==>”+ client.room);仍会输出'发送到==> room1')而客户已经离开了房间。我用“socket.sockets.clients(client.room)”确认了这一点 - 此处不再列出客户端。

有没有人知道为什么我仍然会将消息从客户端发送到他不属于的房间?

更新

在DRC回答之后,我更新了我的发送功能:

client.on("send", function(msg) {
  for (key in socket.sockets.manager.roomClients[client.id]) {
    if (key ==="/" + client.room) {
      socket.sockets.in(client.room).emit("chat", people[client.id], msg);  
    }
  }
});

这是最优雅的解决方案吗?

1 个答案:

答案 0 :(得分:1)

你正在分配client.room,而不是在客户端离开房间时删除它,socket.io没有检查授权,你必须。

每当客户离开房间或检查用户是否在房间内检查io.sockets.manager.roomClients[socket.id]的内容时,请执行删除client.room,请参阅docs

<强>更新 运行后问题

你已经拥有房间名称,所以roomClients [socket.id]的密钥,你可以检查:

if (socket.sockets.manager.roomClients[client.id]['/'+client.room] !== undefined ){
    //the user is part of this room
}

但是这是逻辑。