2016-04-14 37 views
0

Bir kullanıcının bir seferde sadece bir odada olduğunu garanti etmek isterim, ama bunu iltifat etmekte zorlanıyorum. Bir yuva şu anda tüm odaların listesini almak mümkün değil aşağı sorunu haşlanmış olansocket.io: sokete sadece bir oda

Benim şimdiki strateji böyle bir şey yapmaktır.

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'); 
    }); 
}) 

bir sorun var mı socket.rooms ile dokümanlar? Bir soketin bağlı olduğu bir dizi odaya dönmesi gerektiğini söylüyor, ancak verileri bir id nesnesi olarak geri alıyorum. EX: { '/#3tE4Up5PRbTfsU0JAAAD': '/#3tE4Up5PRbTfsU0JAAAD' }

... Ben Socket.io github page günü ['issues']

gibi bir şey beklenebilir Benim durumumda socket.rooms açıklama şöyle demiştir:

bu soket olan odalar tanımlayan dizeleri bir karma içinde, oda adı ile endekslenmiştir. Zaten folowing soruları kontrol ettikten

:

yinelenen olarak işaretlediğiniz ÖNCE

  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

ilk sorunun cevabı görünüyor en çok birlikte çözümlenmiş haldeyken becaus çalışacağından oldukça eminim e kendi çözümümüzü koruduğunu varsayar, ancak bu yöntem üzerinde socket.io kullanarak çalışan bir çözümü tercih ederim.

Ben

cevap

1

socket.io olarak (bu hiç yardım ederse), her soket ayrıca kendi odaya bağlanan istemci üzerinde angular2 beta ile socket.io v1.4.5 son verion kullanıyorum. Bu oda aynı adı taşıyan socket.id. Odalardan ayrılırken, kendi odasından çıkmadığınızdan emin olun.

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 
});