• 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

Aruba Cloud PRO i VPS, Openstack, VMWare, MS Hyper-V
0 głosów
66 wizyt
pytanie zadane 21 marca w JavaScript przez Ziom54d4 Początkujący (310 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 przez ScriptyChris Mędrzec (190,190 p.)
wybrane 21 marca 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 przez Ziom54d4 Początkujący (310 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 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 przez Ziom54d4 Początkujący (310 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 96 wizyt
0 głosów
0 odpowiedzi 163 wizyt
0 głosów
1 odpowiedź 251 wizyt
pytanie zadane 20 października 2015 w PHP przez niezalogowany

91,832 zapytań

140,505 odpowiedzi

316,991 komentarzy

61,163 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...