2015-08-08 133 views
0

我正在嘗試改編一段使用socket.io 0.9編碼的代碼,該代碼返回特定房間和客房列表中的客戶列表(典型聊天室的例子)解決客戶端和客房 - 從socket.io 0.9遷移到+ 1.x

用戶在房間房間

var usersInRoom = io.sockets.clients(room); 

列表

socket.on('rooms', function() { 
    var tmp = io.sockets.manager.rooms; 
    socket.emit('rooms', tmp); 
}); 

TMP看起來像這樣

{ 
    0: Array[1], 
    1: /Lobby: Array[1] 
} 

這樣我就可以顯示在客戶端列表中與瀏覽器這個JavaScript運行。

socket.on('rooms', function(rooms) { 
    $('#room-list').empty(); 
    debugger; 
    for(var room in rooms) { 
     room = room.substring(1, room.length); 
     if (room != '') { 
      $('#room-list').append(divEscapedContentElement(room)); 
     } 
    } 

    $('#room-list div').click(function() { 
     chatApp.processCommand('/join ' + $(this).text()); 
     $('#send-message').focus(); 
    }); 
}); 

但是,對於版本> 1.x,我剛剛發現客戶端/房間已更改。 經過一些環節,我發現在這裏,我可以管理由這樣做是爲了讓房間列表:

socket.on('rooms', function(){ 
    var tmp = socket.rooms; 
    socket.emit('rooms', tmp); 
}); 

這裏的問題是,socket.rooms回報

{ 
    0: "RandomString", 
    1: "Lobby", 
    length: 2 
} 

而我只需要通過'大堂的房間。我不知道隨機字符串從哪裏來。

編輯 通過一些調試,我發現,randomstring是socket.id ...這是正常的這種行爲?將房間和socket.id一起返回?

更新

我終於得到了一些成果

用戶在室內房間

var usersInRoom = getUsersByRoom('/', room); 

function getUsersByRoom(nsp, room) { 
    var users = [] 
    for (var id in io.of(nsp).adapter.rooms[room]) { 
     users.push(io.of(nsp).adapter.nsp.connected[id]); 
    }; 
    return users; 
}; 

列表

function getRooms(io){ 
    var allRooms = io.sockets.adapter.rooms; 
    var allClients = io.engine.clients; 
    var result = []; 
    for(var room in allRooms){ 
     // check the value is not a 'client-socket-id' but a room's name 
     if(!allClients.hasOwnProperty(room)){ 
      result.push(room); 
     } 
    } 
    return result; 
} 

更好更直接的方法來實現結果?

這些都是我檢查鏈接:

How to get room's clients list in socket.io 1.0

socket.io get rooms which socket is currently in

回答

0

似乎也沒有更好的辦法,所以我會用我自己的答案。如果你們有更好的解決方案,我會更新接受的解決方案。

用戶在房間

var usersInRoom = getUsersByRoom('/', room); 

function getUsersByRoom(nsp, room) { 
    var users = [] 
    for (var id in io.of(nsp).adapter.rooms[room]) { 
     users.push(io.of(nsp).adapter.nsp.connected[id]); 
    }; 
    return users; 
}; 

房間清單

function getRooms(io){ 
    var allRooms = io.sockets.adapter.rooms; 
    var allClients = io.engine.clients; 
    var result = []; 
    for(var room in allRooms){ 
     // check the value is not a 'client-socket-id' but a room's name 
     if(!allClients.hasOwnProperty(room)){ 
      result.push(room); 
     } 
    } 
    return result; 
}