【问题标题】:node.js socket.io app - How to kick someone from chat room?node.js socket.io 应用程序 - 如何将某人踢出聊天室?
【发布时间】:2016-07-26 17:00:15
【问题描述】:

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

请注意,clientInfo 是一个全局变量,每当新用户加入房间时,都会将一个对象变量与用户名和房间名称一起传递给服务器。然后执行这段代码

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

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

我添加了一个功能,用户可以输入“kick”作为调用此函数的聊天消息:

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];  
        } 
      }
   });  
}

【问题讨论】:

  • 你希望每个用户都可以踢另一个用户和自己吗?或者您是否需要通过服务器 (=admin) 踢用户?
  • 我想我对这两个问题的回答都是肯定的。我基本上希望能够选择我想要踢出的两个用户中的哪一个。目前,如果任何用户试图把某人踢出去,那个人就是他自己。

标签: node.js sockets


【解决方案1】:

尝试实现下一个想法


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 发送给活着的用户。

【讨论】:

    猜你喜欢
    • 2014-02-10
    • 2017-08-19
    • 1970-01-01
    • 2017-05-31
    • 2019-11-07
    • 2012-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多