2016-07-26 120 views
0

所以我有一個聊天應用程序,其中一次只有兩個用戶可以在一個房間裏。node.js socket.io應用程序 - 如何從聊天室踢人?

請注意,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

我想我的答案對兩個問題都是肯定的。我基本上希望能夠選擇我想踢出哪兩個用戶。目前,如果任何用戶試圖將某人踢出去,那麼某個人將成爲他自己。 – Jay

回答

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

相關問題