2016-04-14 58 views
0

我想保證一個用戶一次只能在一個房間裏,但是我在這方面遇到了麻煩。我煮完問題,下不能夠得到的所有房間的插座是目前在列表socket.io:只有一個房間到一個插座

我目前的策略是做這樣的事情:

io.on('connection', function(socket) { 
    console.log('A user just connected with id ' + socket.id); 
    socket.on("change room", function(data) { 
     // this SHOULD return a list of all rooms this user is in 
     var socketsRooms = socket.rooms; 
     console.log(socket.rooms) //{ '/#3tE4Up5PRbTfsU0JAAAD': '/#3tE4Up5PRbTfsU0JAAAD' } 
     console.log(typeof socket.rooms) // object 
     // Loop through the rooms and leave them 
     for (var room in socketsRooms) { 
      console.log('LEAVING ROOM: ', room); 
      socket.leave(room); 
     } 

     // Join the new room 
     socket.join(data.newroom); 
    }); 
    socket.on('disconnect', function() { 
     console.log('user ' + socket.id + ' disconnected'); 
    }); 
}) 

是否有問題與socket.rooms的文檔?它說它應該返回一個套接字連接到的房間數組,但是我將數據作爲一個id對象返回。 EX: { '/#3tE4Up5PRbTfsU0JAAAD': '/#3tE4Up5PRbTfsU0JAAAD' }

...對我來說,我希望像['issues']

在Socket.io github page的socket.rooms介紹說:

串識別房間這個插座的哈希中,索引爲 房間名稱。

之前打標爲重複:

我已經簽出瞭如下因素的問題:

  1. How to leave all rooms that the socket is connected to at one go in Node.js
  2. socket.io: assure socket joins only one room at a time

回答第一個問題似乎大多數黑客一起解決方案,我很確定它會工作,因爲它假定解決方案是維護我們自己的列表,但我更喜歡使用socket.io的工作解決方案。

我使用在客戶端上angular2測試socket.io v1.4.5最新優化版本(有沒有什麼幫助了在所有)

回答

1

在socket.io,每個插座還連接到了自己的房間。這間客房擁有相同的名字socket.id。所以在離開房間時,請確保不要離開自己的房間。

for(room in socket.rooms){ 
    if(socket.id !== room) socket.leave(room); 
} 
socket.join(data.newroom, function(){ 
    console.log('rooms', socket.rooms); // here you'll see two rooms: one with socket.id and another with data.newroom 
});