Frage

Ich habe diesen Code gerade, der den Nick und den Raum festlegt:

io.sockets.on('connection', function(client){
    var Room = "";
    client.on("setNickAndRoom", function(nick, fn){
        client.join(nick.room);
        Room = nick.room;
        client.broadcast.to(Room).emit('count', "Connected:" + " " + count);
        fn({msg :"Connected:" + " " + count});
    });

Ich wollte wissen, wie ich bekommen konnte, wie viele Leute mit einem bestimmten Chatroom verbunden sind ... wie Raum.Length

Kundenseite:

function Chat(){
    this.socket = null;
    this.Nickname = "";
    this.Room = "";
    var synched = $('#syncUp');
    this.Connect = function(nick, room){ 
        socket =  io.connect('http://vybeing.com:8080');    
        Nickname = nick;
        Room = room;
        //conectarse
        socket.on('connect',function (data) {
            socket.emit('setNickAndRoom', {nick: nick, room: room}, function(response){
                $("#connection").html("<p>" + response.msg + "</p>");
            });
        });
}

Ich fand das, aber es gibt undefinierte:

count = io.rooms[Room].length;
War es hilfreich?

Lösung

Wenn Sie Version <1 verwenden,

var clients = io.sockets.clients(nick.room); // all users from room

Andere Tipps

Für Socket.io -Versionen> = 1.0:

Beachten Sie, dass Zimmer mit einem tatsächlichen Typen wurden .length Eigenschaft in 1.4, so dass die 1.4.x -Methode von nun an stabil sein sollte.

Alle Kunden zu zählen, die an verbunden sind 'my_room':

1.4+:

var room = io.sockets.adapter.rooms['my_room'];
room.length;

1.3.x:

var room = io.sockets.adapter.rooms['my_room'];
Object.keys(room).length;

1.0.x bis 1.2.x:

var room = io.adapter.rooms['my_room'];
Object.keys(room).length;

Dies setzt voraus, dass Sie mit dem laufen Standardraumadapter auf einem einzelnen Knoten (im Gegensatz zu a Cluster). Dinge sind komplizierter Wenn Sie in einem Cluster sind.


Andere verwandte Beispiele:

  • Zählen Sie alle mit Server verbundenen Clients:

    var srvSockets = io.sockets.sockets;
    Object.keys(srvSockets).length;
    
  • Zählen Sie alle mit dem Namespace verbundenen Clients '/chat':

    var nspSockets = io.of('/chat').sockets;
    Object.keys(nspSockets).length
    

Für Socket.io 1.4.6 hat das für mich funktioniert, zusätzlich zum Raum den Namespace anzugeben. Wenn Sie den Standard -Namespace verwenden, können Sie ihn einfach angeben ['/']. Um beispielsweise die Anzahl der Clients in den Raum "Küche" im Standard -Namespace (NSPS) in Verbindung zu bringen, würden Sie schreiben:

var io = require('socket.io')();
io.nsps['/'].adapter.rooms['kitchen'].length

Heads up: Wenn niemand einem Raum beigetreten ist, wurde es noch nicht geschaffen, deshalb wurde es noch nicht erstellt io.nsps['/'].adapter.rooms['kitchen'] wird zurückkehren undefined. Wenn Sie versuchen, anzurufen .length In der undefinierten Küche stürzt Ihre App ab.

In Version 1.4.5

var clientNumber = io.sockets.adapter.rooms[room].length;

Ich benutze 1.4.6 und das hat den Trick gemacht:

Object.keys(io.sockets.connected).length

Ich wollte eine Liste von Benutzern in einem Raum bekommen. Dies war meine Lösung.

Ich habe meinem Sockel eine Benutzername -Immobilie hinzugefügt, aber für die Vollständigkeit habe ich das in "ID" geändert, was die ID des Socket ist.

var sockets = io.in("room_name")
Object.keys(sockets.sockets).forEach((item) => {
  console.log("TODO: Item:", sockets.sockets[item].id)            
})

Socket.io v2.0.3

Für Socket.io v2.0.3 habe ich einen Redis-Server ausgeführt und verwenden Socket.io-Redis-Plugin. Dann können Sie:

io.of('/').adapter.clients(['room1', 'room2'], (err, clients) => {
  console.log(clients); // an array containing socket ids in 'room1' and/or 'room2'
});

Code ist von https://github.com/socketio/socket.io-redis#redisadapterclientsroomsArray-fnfunction

Kevzettler zeigte mich auf Socket.io-Redis


Die andere Antwort auf Socket.io v2.0.3 vom faulen Codierer hat bei mir nicht funktioniert. Es gab mir eine Liste aller verbundenen Kunden, unabhängig vom Raum.

Setzen Sie dies in eine Funktion und es gibt Ihnen fehlgeschlagen, um das Absturz zu verhindern:

var roomCount = io.nsps['/'].adapter.rooms[roomName];
if (!roomCount) return null;
return roomCount.length;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top