• 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

VPS Starter Arubacloud
0 głosów
510 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 140 wizyt
0 głosów
0 odpowiedzi 293 wizyt
0 głosów
1 odpowiedź 274 wizyt
pytanie zadane 20 października 2015 w PHP przez niezalogowany

92,958 zapytań

141,918 odpowiedzi

321,148 komentarzy

62,288 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.

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...