2015-08-08 132 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; 
}