2013-04-30 15 views
10

Mam aplikację czatu na Node.js i Socket.io, użytkownik może łączyć się i rozłączać za pomocą przycisku ... Jestem posiadanie listy użytkowników online, która jest doskonale zarządzana przy pomocy zdefiniowanych zdarzeń, które uruchamia użytkownik.

Ale problem jest nie jestem w stanie wykryć, czy użytkownik traci połączenie lub zamknięte okno przeglądarki bez odłączania się ręcznie (za pomocą przycisku rozłączenia) ...jak wykryć, że połączenie użytkownika zostało utracone lub zamknął okno przeglądarki w Nodejs socket.io

Ten socket.io zdarzenie jest zwolniony tylko wtedy, gdy użytkownik sam się rozłącza, gdy utracił połączenie.

socket.on('disconnect',function(){ 
    console.log('user disconnected'); }); 

Chcę mieć naprawdę dobry mechanizm, aby mieć oko na użytkowników, aby zaktualizować listę użytkowników online.

Odpowiedz

15

Jaka jest różnica? Zamknięcie okna, przecięcie przewodu ethernetowego ... to wszystko jest takie samo dla serwera: koniec połączenia.

przeczytaniu socket.io docs: https://github.com/LearnBoost/socket.io/wiki/Exposed-events

socket.on ('Disconnect', function() {}) - impreza odłączyć wypala we wszystkich przypadkach, kiedy połączenie klient-serwer jest zamknięty . Występuje w przypadku niepożądanych, niechcianych, mobilnych, nieruchliwych, rozłączonych klientów i serwerów.

Nie powinieneś polegać na swoim przycisku, ponieważ ludzie mogą się rozłączyć bez użycia tego przycisku. Użyj zdarzenia rozłączenia i gdy gniazdo się rozłączy (gniazdo, nie użytkownik, ponieważ węzeł wie o gniazdach), musisz dowiedzieć się, kto był "właścicielem" tego gniazda i oznaczać go jako "odłączony". Albo jeszcze lepiej, poczekaj kilka sekund, a następnie oznacz go jako offline. Czemu? Ponieważ zdarzenie rozłączenia uruchomi się, nawet jeśli użytkownik ponownie załaduje stronę lub przejdzie do innej. Więc jeśli poczekasz kilka sekund, użytkownik znowu będzie online.

Miałem też ten problem, a ja stworzyłem "obserwatora", który działa co X sekund i oznacza użytkowników jako offline, gdy nie są właścicielami żadnego gniazda lub gdy wydają się być daleko (brak aktywności przez długi czas czas).

+1

OK ... rozumiem, że zdarzenia "rozłączenia" działają, ale po 10-15 sekundach, tak na początku myślałem, że to nigdy nie nastąpi ... moje złe. –

+0

jak uzyskać odłączonego użytkownika session.id ..? –

+2

Wywołanie odłączonego użytkownika session.id wyjaśnione http://stackoverflow.com/questions/8286683/socket-id-of-disconnecting-client?answertab=active#tab-top –

Powiązane problemy