所以我有聊天应用程序,一次只有两个用户可以在一个房间里。
请注意,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];
}
}
});
}
答案 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
。