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?
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?
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.
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.
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
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;
};
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);
});
}
Dziękujemy za udostępnienie swojej sztuczki. Twoja odpowiedź jest teraz prawdziwą odpowiedzią z aktualnym plikiem socket.io. – MacKentoch
Sprawdź to http://stackoverflow.com/ pytania/6563885/socket-io-how-do-i-get-a-list-of-connected-sockets-clients – Foreever
A to: http://stackoverflow.com/questions/9352549/getting-how-many-people -to-in-a-chat-room-in-socket-io # 24425207 – Musa