node.js socket.io 应用程序 - 如何将某人踢出聊天室?

Posted

技术标签:

【中文标题】node.js socket.io 应用程序 - 如何将某人踢出聊天室?【英文标题】:node.js socket.io app - How to kick someone from chat room? 【发布时间】: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) 踢用户? 我想我对这两个问题的回答都是肯定的。我基本上希望能够选择我想要踢出的两个用户中的哪一个。目前,如果任何用户试图把某人踢出去,那个人就是他自己。 【参考方案1】:

尝试实现下一个想法


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

socket.on('connect', function 
    socket.send(JSON.stringifydo: "introduce", name: "User1", room: "dasRoom")
) 

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

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

函数Kick 必须实现按名称查找用户、向受害者发送goodbay 消息并断开套接字的逻辑。服务器还必须通过套接字将User1 leave room 发送给活着的用户。

【讨论】:

以上是关于node.js socket.io 应用程序 - 如何将某人踢出聊天室?的主要内容,如果未能解决你的问题,请参考以下文章

Heroku 上的 socket.io + node.js

找不到Node.js /socket.io/socket.io.js express 4.0

Node.JS 寻找 socket.IO 的替代方案

Node.js socket.io 没有响应 iOS socket.io 发出请求

在没有 node.js 的情况下独立使用 socket.io

Node.js + Socket.io 在套接字中存储数据