• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Aktualizowanie informacji na wszystkich połączonych klientach, kiedy ktoś się rozłączy

Object Storage Arubacloud
0 głosów
307 wizyt
pytanie zadane 21 marca 2023 w JavaScript przez Ziom54d4 Początkujący (350 p.)
Witam
Używając w JS biblioteki ws do obsługi websocketów natknąłem się na pewną zagwozdkę, mianowicie jak obsłużyć aktualizowanie informacji o ilości połączonych klientów, kiedy ktoś się rozłączy. Mam na myśli to, że kiedy otworze stronę to w prawym górnym rogu mam informacje, ile obecnie jest osób połączonych. Gdy włączę jedno okno piszę 1, gdy drugie piszę 2, ale w momencie kiedy rozłączę jednego z nich, wyłączając okno to informacja nie jest aktualizowana od razu tylko muszę odświeżyć stronę, aby widzieć zmianę.
https://pastebin.com/u/ziom54d4

1 odpowiedź

0 głosów
odpowiedź 21 marca 2023 przez ScriptyChris Mędrzec (190,190 p.)
wybrane 21 marca 2023 przez Ziom54d4
 
Najlepsza
wss.on("connection", ws => {
    [...wss.clients].forEach(c => c.send(wss.clients.size));
})

Podpiąłeś się na "connection" event pod cały serwer socketowy i dlatego otrzymujesz tylko informacje o aktualnie połączonych klientach. Żeby obsłużyć sytuacje odłączania się klientów, powinieneś się podpiąć pod "close" event na poszczególnych klientach i wtedy przesłać informację o aktualnej liczbie tych połączonych, gdy którykolwiek z nich się odłącza.

https://github.com/websockets/ws/blob/HEAD/doc/ws.md#event-close-1

komentarz 21 marca 2023 przez Ziom54d4 Początkujący (350 p.)
wss.on("close", ws => {
    [...wss.clients].forEach(c => c.send(wss.clients.size));
})

Zapisałem coś takiego i bez efektu. Co ciekawe nawet jak wpiszę console.log w tym callbacku to nic się w konsoli nie wyświetla gdy wyłączę strone

1
komentarz 21 marca 2023 przez ScriptyChris Mędrzec (190,190 p.)

Bo wss.on podpina się na serwer, a nie klienta - a Tobie potrzeba wykryć rozłączenia poszczególnych klientów, a nie całego serwera. Użyj ws.on (ten ws, który odbierasz w parametrze callbacka przekazanego do wss.on("connection").

komentarz 21 marca 2023 przez Ziom54d4 Początkujący (350 p.)

Zapisałem coś takiego:

wss.on("connection", ws => {
    [...wss.clients].forEach(c => c.send(wss.clients.size));
    ws.on("close", ws => {
        [...wss.clients].forEach(c => c.send(wss.clients.size));
    })
})

I działa jak natura chciała. Oczywiście zapomniałem że wss odnosi się w moim przypadku do serwera a ws podany jako parametr do poszczególnych klientów. Swoją drogą nie rozumiem dlaczego w dokumentacji nazywają ten parametr ws a nie client

 

 

Podobne pytania

–1 głos
0 odpowiedzi 135 wizyt
0 głosów
0 odpowiedzi 228 wizyt
0 głosów
1 odpowiedź 263 wizyt
pytanie zadane 20 października 2015 w PHP przez niezalogowany

92,551 zapytań

141,399 odpowiedzi

319,529 komentarzy

61,937 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...