2014-05-25 14 views
35

Mogę dostać listę klientów w pokoju z tym kodem w socket.io 0.9.Jak uzyskać listę klientów pokoju w socket.io 1.0

io.sockets.clients(roomName) 

Jak mogę to zrobić w socket.io 1.0?

+0

Sprawdź to http://stackoverflow.com/ pytania/6563885/socket-io-how-do-i-get-a-list-of-connected-sockets-clients – Foreever

+0

A to: http://stackoverflow.com/questions/9352549/getting-how-many-people -to-in-a-chat-room-in-socket-io # 24425207 – Musa

Odpowiedz

5

Możesz zobaczyć this github pull request do dyskusji na ten temat, jednak wydaje się, że ta funkcjonalność została usunięta z wersji 1.0 przed premierą dla SocketIO.

11

Używając @ryan_Hdot link, stworzyłem małą funkcję tymczasową w moim kodzie, co zapobiega zachowaniu łaty. Oto ona:

function getClient(roomId) { 
    var res = [], 
     room = io.sockets.adapter.rooms[roomId]; 
    if (room) { 
    for (var id in room) { 
     res.push(io.sockets.adapter.nsp.connected[id]); 
    } 
    } 
    return res; 
} 

przypadku używania nazw:

function getClient (ns, id) { 
    return io.nsps[ns].adapter.rooms[id] 
} 

którego używam jako tymczasowy fix dla io.sockets.clients(roomId) która staje findClientsSocketByRoomId(roomId).

EDIT:

Większość czasu warto zastanowić unikając przy użyciu tej metody, jeśli to możliwe.

To, co teraz robię, to to, że zwykle umieszczam klienta w jego pokoju (np. W pokoju o nazwie clientID). Zauważyłem, że kod jest bardziej czytelny w ten sposób i nie muszę już polegać na tym obejściu.

Nie przetestowałem tego również z adapterem Redis.

Jeśli musisz, zobacz także this related question, jeśli używasz przestrzeni nazw.

36

Rozważ ten raczej pełniejszą odpowiedź umieszczonego w komentarzu powyżej na pytanie: https://stackoverflow.com/a/24425207/1449799


klientów w pokoju można znaleźć na

io.nsps[yourNamespace].adapter.rooms[roomName] 

Jest to tablica asocjacyjna z kluczami, które są identyfikatorami gniazd. W naszym przypadku chcieliśmy poznać liczbę klientów w pokoju, więc zrobiliśmy Object.keys(io.nsps[yourNamespace].adapter.rooms[roomName]).length

Jeśli nie widziałeś/używałeś przestrzeni nazw (jak ten facet [ja]), możesz dowiedzieć się o nich tutaj http://socket.io/docs/rooms-and-namespaces/(najważniejsze: domyślna przestrzeń nazw jest '/')

Poprawiony (esp dla @Zettam.):

kasa to repo, aby zobaczyć ten robocza: https://github.com/thegreatmichael/socket-io-clients

+3

+1 za wzmiankę o Object.keys() :) –

+1

Czy jestem "tym gościem"? ^^ Ponadto domyślną przestrzenią nazw jest "/" lub "". – nha

+0

@Nha przepraszam, nie, * Jestem * "ten facet" – Michael

7

dla tych z Was, używając nazw ja stworzyła też funkcję, która może obsługiwać różne nazwy kroków. To zupełnie tak samo jak odpowiedź nha.

function get_users_by_room(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; 
}; 
5

Jako co najmniej 1.4.5 Metoda Nha nie działa już obaj, i nadal nie ma api publicznego dla uzyskania klientów w pomieszczeniu. Oto, co działa dla mnie.

io.sockets.adapter.rooms[roomId] zwraca obiekt, który ma dwie właściwości, gniazda i długość. Pierwszym z nich jest inny obiekt, który ma socketid za klucze i logiczne jako wartości:

Room { 
    sockets: 
    { '/#vQh0q0gVKgtLGIQGAAAB': true, 
    '/#p9Z7l6UeYwhBQkdoAAAD': true }, 
    length: 2 } 

Więc mój kod, aby uzyskać klientów wygląda następująco:

var sioRoom = io.sockets.adapter.rooms[roomId]; 
if(sioRoom) { 
    Object.keys(sioRoom.sockets).forEach(function(socketId){ 
    console.log("sioRoom client socket Id: " + socketId); 
    }); 
} 
+0

Dziękujemy za udostępnienie swojej sztuczki. Twoja odpowiedź jest teraz prawdziwą odpowiedzią z aktualnym plikiem socket.io. – MacKentoch

Powiązane problemy