wake-up-neo.net

wie viele Personen sich in einem Chatroom in socket.io befinden

Ich habe jetzt diesen Code, der den Nick und den Raum setzt:

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 erreichen kann, wie viele Personen mit einem bestimmten Chatroom verbunden sind ... wie z. B. Room.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 habe das gefunden, aber es gibt undefined:

count = io.rooms[Room].length;
33
re1man

Wenn Sie Version <1 verwenden,

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

27

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

Beachten Sie, dass Räume mit der Eigenschaft .length in 1.4 zu tatsächlichen Typen wurden. Daher sollte die 1.4.x-Methode ab sofort stabil sein.

So zählen Sie alle Clients, die mit 'my_room' verbunden sind:

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 den Standardraumadapter auf einem einzelnen Knoten ausführen (im Gegensatz zu einem Cluster ). Die Dinge sind komplizierter wenn Sie sich in einem Cluster befinden.


Andere verwandte Beispiele:

  • Zählen Sie alle Clients, die mit dem Server verbunden sind:

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

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

Für socket.io 1.4.6 funktionierte für mich die Angabe des Namensraums zusätzlich zum Raum. Wenn Sie den Standard-Namespace verwenden, können Sie ihn einfach als ['/'] angeben. Um beispielsweise die Anzahl der Clients, die mit dem Raum 'Küche' verbunden sind, im Standard-Namespace (nsps) zu erhalten, würden Sie Folgendes schreiben:

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

Heads up: Wenn sich niemand einem Raum angeschlossen hat, wurde er noch nicht erstellt. Daher gibt io.nsps['/'].adapter.rooms['kitchen']undefined zurück. Wenn Sie versuchen, .length in der undefined Küche aufzurufen, stürzt Ihre App ab.

6

In Version 1.4.5

var clientNumber = io.sockets.adapter.rooms[room].length;
5
Márton Vető

Ich wollte eine Liste von Benutzern in einem Raum erhalten. Das war meine Lösung.

Ich habe meinem Socket eine Benutzernamen-Eigenschaft hinzugefügt, aber der Vollständigkeit halber habe ich diese in "ID" geändert, die die ID des Sockets 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

1
The Lazy Coder

Für socket.io v2.0.3 habe ich schließlich einen Redis-Server ausgeführt und das Plugin socket.io-redis verwendet. Dann können Sie tun:

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

der Code stammt von https://github.com/socketio/socket.io-redis#redisadapterclientsroomsarray-fnfunction

kevzettler wies mich auf socket.io-redis hin


Die andere Antwort auf socket.io v2.0.3 von The Lazy Coder hat für mich nicht funktioniert, es gab mir eine Liste aller verbundenen Clients, unabhängig vom Raum.

1
Dries Cleymans

Ich verwende 1.4.6 und das hat den Trick:

Object.keys(io.sockets.connected).length
0
Alex Klibisz

wenn Sie dies in eine Funktion einfügen, erhalten Sie eine Ausfallsicherheit, um einen Absturz zu verhindern:

var roomCount = io.nsps['/'].adapter.rooms[roomName];
if (!roomCount) return null;
return roomCount.length;
0
Video Coder