Próbuję uzyskać listę wszystkich gniazd / klientów, które są obecnie połączone.
io.sockets
niestety nie zwraca tablicy.
Wiem, że mógłbym zachować własną listę za pomocą tablicy, ale nie sądzę, że jest to optymalne rozwiązanie z 2 powodów:
Nadmierność. Socket.IO przechowuje już kopię tej listy.
Socket.IO zapewnia metodę ustawiania dowolnych wartości pól dla klientów (tj .:),
socket.set('nickname', 'superman')
więc musiałbym nadążać za tymi zmianami, gdybym miał utrzymywać własną listę.
Wsparcie?
socket
to id,io.sockets.sockets[socket]
to gniazdo.err
i jeśli używasz magazynu pamięci, to zawszenull
..get('nickname', function(err, nickname) { ... })
Odpowiedzi:
W Socket.IO 0.7 masz
clients
metodę w przestrzeniach nazw, która zwraca tablicę wszystkich połączonych gniazd.API bez przestrzeni nazw:
Przestrzeń nazw
Mam nadzieję, że pomoże to komuś w przyszłości
AKTUALIZACJA 2020 Mar 06
Od wersji 1.xi nowszej, skorzystaj z tego linku: sprawdzanie liczby osób na czacie w socket.io
źródło
connected
obiektu przestrzeni nazw.var clients = io.sockets.connected();
oczywiście nie działa. DziękiSocket.io 1.4
Object.keys(io.sockets.sockets);
daje wszystkie podłączone gniazda.Socket.io 1.0 Począwszy od socket.io 1.0, rzeczywista zaakceptowana odpowiedź nie jest już poprawna. Zrobiłem więc małą funkcję, której używam jako tymczasowej poprawki:
Interfejs API dla braku przestrzeni nazw zostanie zmieniony
Interfejs API dla przestrzeni nazw staje się:
Zobacz także to pokrewne pytanie , w którym podaję funkcję zwracającą gniazda dla danego pomieszczenia.
Socket.io 0.7
API bez przestrzeni nazw :
Na przestrzeni nazw
Uwaga: ponieważ wydaje się, że interfejs API socket.io jest podatny na awarie, a niektóre rozwiązania polegają na szczegółach implementacji, może to być kwestia samodzielnego śledzenia klientów:
źródło
Po socket.io 1.0 nie możemy używać
już. Zamiast tego możesz użyć następującego
źródło
var clients_in_the_room = io.sockets.adapter.rooms[roomId].sockets
Korzystanie z Socket.IO 1.x:
Uzyskaj tablicę połączonych klientów:
Uzyskaj liczbę połączonych klientów:
źródło
Bardzo prosty w socket.io 1.3:
io.sockets.sockets
- to tablica zawierająca połączone obiekty gniazd. Jeśli zapisałeś nazwę użytkownika w każdym gnieździe, możesz:Bum. Masz nazwy wszystkich połączonych użytkowników.
źródło
(Object.keys(io.engine.clients)
Przeszedłem dzisiaj przez ten ból. Socket.io byłby znacznie lepszy, gdyby mogli stworzyć odpowiednią dokumentację dla swojego API.
W każdym razie próbowałem zajrzeć do io.sockets i znalazłem kilka opcji, których możemy użyć:
Zwróć również uwagę, że podczas korzystania z socket.io z przestrzenią nazw powyższe metody nie działają, ponieważ io.sockets staje się tablicą zamiast obiektem. Aby rozwiązać ten problem, po prostu zamień io.sockets na io (tj. Io.sockets.connected stanie się io.connected, a io.sockets.adapter.rooms stanie się io.adapter.rooms ...)
Testowane na socket.io 1.3.5
źródło
Wersja +2.0
W wersji +2.0 określasz przestrzeń nazw / pokój / węzeł, o który pytasz.
Podobnie jak w przypadku rozgłaszania, wartością domyślną są wszyscy klienci z domyślnej przestrzeni nazw („/”):
Pobiera listę identyfikatorów klientów połączonych z określoną przestrzenią nazw (we wszystkich węzłach, jeśli dotyczy).
Przykład pobierania wszystkich klientów w pokoju przestrzeni nazw:
To pochodzi z oficjalnej dokumentacji: Socket.IO Server-API
źródło
socket.username
właściwość do każdego gniazda podczas łączenia, czy istnieje sposób, w jaki mogę wyświetlić wszystkie te obiekty gniazda (w tym właściwości niestandardowe, które dodam do każdego gniazda)? (dla odniesienia, obecnie używam globalnej zmiennej obiektu do przechowywania dodatkowych informacji o gnieździe, gdy klient się łączy - więc nie pytam, jak to ustawić - tylko interesuje mnie, czy istnieje sposób na wyświetlenie wszystkich obiektów gniazd domyślnie) .console.log(io.sockets.connected)
- wydaje się być obiektem, gdzie każda wartość nieruchomości jest „obiekt Gniazdo”, która zawiera te właściwościnsp
,server
,adaptor
,id
(string),client
,conn
,rooms
,acks
,connected
,disconnected
,handshake
,fns
,flags
,_rooms
,_events
,_eventsCount
i wreszcieusername
, który jest własnością niestandardowy i dodać do każdego gniazda na połączenia.Myślę, że możemy uzyskać dostęp do obiektu gniazda z serwera i możesz przypisać pseudonim i wskazać jego identyfikator gniazda,
W dniu
disconnect
usuń pseudonim z domenyio.sockets.sockets
.źródło
To najlepszy sposób, aby uzyskać do niego dostęp w socket.io 1.3
Object.keys(socket.adapter.rooms[room_id])
źródło
var room = io.sockets.adapter.rooms[room_id];
var connections = _.map(Object.keys(room), function(socketId){ return (io.sockets.connected[socketId].connected == true) });
Dla każdego, kto chce tylko LICZBA podłączonych klientów, wierzę, że to wystarczy:
io.sockets.manager.server.connections
źródło
io.sockets.clients().length
io.sockets.manager.server.connections
iio.sockets.clients().length
nie działają. To zadziałało dla mnie - tylko dla hrabiego -io.engine.clientsCount
i dla listy klientów -io.engine.clientsCount
. Tak jest od ponad 3 lat. Wydaje się, że jest to niezawodny sposób na uzyskanie informacji o połączeniu. (Na podstawie odpowiedzi Josepha Dykstry)Socket.io 1.4.4
Przykładowy kod dla Ciebie.
Myślę, że pomoże komuś ten blok kodu.
źródło
W Socket.IO 1.4
Aby uzyskać tablicę wszystkich podłączonych użytkowników:
Aby uzyskać liczbę wszystkich klientów:
źródło
Począwszy od socket.io 1.5, zwróć uwagę na zmianę w stosunku do indexOf, który wydaje się być zdeprecjonowany i zastąpiony przez valueOf
W przypadku socket.io w wersji 2.0.3 działa następujący kod:
źródło
na socket.io 1.3, zrobiłem to w 2 liniach
źródło
Socket.io 1.7.3 (+):
źródło
W wersji 2.3 to działa i dostaniesz również gniazdo , wydaje mi się, że socketIo zmienia się zbyt szybko i za dużo, a dokumentacja jest mało czytelna po używaniu go przez jakiś czas.
nadal to nie jest w porządku, ponieważ zawsze mam to uczucie z gniazdem Io
źródło
Uważam, że można uzyskać do tego dostęp z właściwości menedżera gniazda?
źródło
Widzę tutaj wiele dobrych odpowiedzi, a wiele z nich jest całkiem przydatnych, ale nie do końca potrzebnych. Używam gniazd dla funkcji pubsub, w której zainteresowany klient może nasłuchiwać zmian w danym rekordzie.
Moim konkretnym problemem było to, że to samo gniazdo kilka razy łączyło się z tym samym pokojem. Rozwiązaniem tego problemu było sprawdzenie, czy gniazdo ma już pomieszczenie w jego pomieszczeniach.
Mam nadzieję, że to komuś pomoże.
źródło
Jest to najprostszy sposób w Socket.IO 1.0+, jeśli nie używasz przestrzeni nazw ani pokojów.
Spowoduje to sprawdzenie domyślnej przestrzeni nazw i określenie długości tablicy gniazd, bez konieczności jej używania
Object.keys()
źródło
Od wersji 1.5.1 mogę uzyskać dostęp do wszystkich gniazd w przestrzeni nazw za pomocą:
Z jakiegoś powodu używają zwykłego obiektu zamiast tablicy do przechowywania identyfikatorów gniazd.
źródło
of()
że w takim przypadku możesz całkowicie usunąć połączenie.W trybie klastra za pomocą adaptera redis
Ponieważ każde gniazdo samo w sobie jest pokojem, można sprawdzić, czy gniazdo istnieje, używając tego samego.
źródło
Oto szybki sposób konwersji skrótu połączonych gniazd z przestrzeni nazw na tablicę przy użyciu generatorów ES6 (dotyczy socket.io> = v1.0.0):
źródło
Nie wiem, czy to nadal trwa. Ale coś takiego właśnie skończyło się na tym (trzymam obiekt sesji na każdym podłączonym gnieździe, który z kolei zawiera nazwę użytkownika i inne informacje:
źródło
Jeśli projekt ma socket.io klaster to oznacza socket.io-Redis adapter jest używany.
W przypadku podobnym do powyższego, proces pobierania wszystkich podłączonych gniazd musi odbywać się za pomocą adaptera socket.io-redis . W tym celu można wykorzystać poniższe przykłady;
Proszę odwiedź uzyskać więcej informacji, stronę github socket.io-redis .
źródło
[email protected]
Użyłem Object.Keys, aby uzyskać tablicę podłączonych gniazd. Następnie w tej samej tablicy wykonaj iterację z funkcją map, aby zbudować nową tablicę obiektów
Być może ta odpowiedź może pomóc w uzyskaniu tablicy identyfikatorów gniazda / nazw użytkowników.
źródło
wersja 10
źródło
socket.io 2.1.1
, otrzymujęTypeError: clients.map is not a function
i chociaż wygląda to obiecująco, nie jestem do końca pewien, co przyniesie powyższy przykład - miałem nadzieję, że zautomatyzuje on utworzenie tablicy obiektów klienta z dołączonymi nazwami użytkowników :).