2013-07-15 46 views
0

我已經放在一起聊天應用程序,人們可以加入/離開房間。我遇到了一些非常奇怪的事情,我真的無法理解它。即使客戶端已經離開房間,socket.io消息仍然被廣播

這是從我的server.js的摘錄(後端):

client.on("send", function(msg) { 
    console.log("Sending to ==> " + client.room); 
    if ('undefined' !== typeof client.room) { 
    socket.sockets.in(client.room).emit("chat", people[client.id], msg); 
    } 
}); 

我本質上是「迫使」人們加入一個房間(如果他們不是在一個房間裏,client.room返回undefined )

我在前端放置了兩個按鈕,一個加入房間,一個放置房間。加入按鈕通過處理:

client.on("joinRoom", function(name) { 
    client.join(name); //where name is the name of the room coming from the frontend 
} 

的留有餘地的功能如下:

client.on("leaveRoom", function(name) { 
    client.leave(name); 
} 

現在的問題是這樣的:client.leave後(名);用戶仍然可以發送消息,而console.log(「發送到==>」+ client.room);仍然會輸出'發送到==> room1'),而客戶端已經離開了房間。我用「socket.sockets.clients(client.room)」證實了這一點 - 客戶端不再在這裏列出。

有沒有人有任何想法,爲什麼我仍然從客戶端發送消息到他不屬於的房間?

UPDATE

從剛果民主共和國的答案後,我已經更新了我的發送功能:

client.on("send", function(msg) { 
    for (key in socket.sockets.manager.roomClients[client.id]) { 
    if (key ==="/" + client.room) { 
     socket.sockets.in(client.room).emit("chat", people[client.id], msg); 
    } 
    } 
}); 

這是最優雅的解決方案?

回答

1

您正在分配client.room,並且在客戶端離開房間時不刪除它,socket.io不檢查有關授權,您必須。

所以做刪除client.room每當客戶端離開房間或檢查,如果用戶是在一個房間裏檢查io.sockets.manager.roomClients[socket.id]內容,請參閱docs

UPDATE 運算問題MOD之後。

你已經有了房間名稱,所以roomClients [socket.id】鍵,你可以檢查:

if (socket.sockets.manager.roomClients[client.id]['/'+client.room] !== undefined){ 
    //the user is part of this room 
} 

,但肯定的是邏輯。

+0

請在我的文章中看到更新。謝謝 – Tamas

+0

非常感謝:) – Tamas

相關問題