【问题标题】:Resolve Clients and rooms - Migration from socket.io 0.9 to +1.x解决客户和房间 - 从 socket.io 0.9 迁移到 +1.x
【发布时间】:2015-11-01 01:00:18
【问题描述】:

我正在尝试修改一段使用 socket.io 0.9 编码的代码,它返回特定房间中的客户列表和房间列表(典型的聊天室示例)

房间内的用户

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
}

我只需要经过“大厅”房间。我不知道随机字符串是从哪里来的。

编辑 通过一些调试我发现,随机字符串是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

【问题讨论】:

    标签: node.js sockets socket.io chatroom


    【解决方案1】:

    似乎没有更好的方法,所以我将使用我自己的答案。如果你们有更好的解决方案,我会更新接受的解决方案。

    房间内的用户

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-20
      • 2015-01-24
      • 2012-06-06
      • 1970-01-01
      • 2018-08-10
      • 2017-03-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多