node.js socket.io app - 如何从聊天室踢人?

时间:2016-07-26 17:00:16

标签: node.js sockets

所以我有聊天应用程序,一次只有两个用户可以在一个房间里。

请注意,clientInfo是一个全局变量,只要新用户加入房间,就会使用用户名和房间名称将对象变量传递给服务器。然后执行此代码

socket.on('joinRoom', function(userDetails){

  clientInfo[socket.id] = userDetails; //variable contains name and room joined. 
  socket.join(userDetails.room);
}

我添加了一项功能,用户可以在其中键入“踢”字样。作为将调用此函数的聊天消息:

function kickUser(socket){           

  socket.leave(clientInfo[socket.id].room);
  delete clientInfo[socket.id];

}

上面的代码工作正常,但我如何更改功能以踢出房间里的其他用户?我尝试了下面的代码,但我仍然把自己踢出去了。我认为socket.leave()并不关心套接字ID,但它只使用房间名称和调用函数的人。

function kickUser(socket){

  var info = clientInfo[socket.id];  

  if (typeof info == 'undefined'){    
    return;
  }

   Object.keys(clientInfo).forEach(function(socketId){          
     if(info.room == clientInfo[socketId].room) {
        if (info.name != clientInfo[socketId].name){          
          socket.leave(clientInfo[socketId].room);
          delete clientInfo[socketId];  
        } 
      }
   });  
}

1 个答案:

答案 0 :(得分:0)

尝试实施下一个想法

socket.on('connection', function(socket){ ... });中,您必须识别此连接/套接字的用户名和空间:客户端可以在连接上发送用户名/空间

socket.on('connect', function {
    socket.send(JSON.stringify{do: "introduce", name: "User1", room: "dasRoom"})
}) 

或服务器可以在client cookie中读取它。您也可以在这里查看房间内的用户数。此信息可以存储在全局变量中。

用户可以通过套接字发送指定的消息,例如{do: "kick , user: "User1"},或请求网址。例如/kick/User1

函数Kick必须实现逻辑以按名称查找用户,向受害者发送goodbay消息并断开套接字。此外,服务器必须通过套接字向活动用户发送User1 leave room