как определить, что соединение пользователя потеряно или он закрыл окно браузера в Nodejs socket.io

У меня есть приложение для чата на Node.js и Socket.io, пользователь может подключаться и отключаться с помощью кнопки... У меня есть список онлайн-пользователей, который прекрасно управляется с помощью определенных мною событий, которые запускает пользователь.

Но проблема в том, что я не могу определить, потерял ли пользователь соединение или закрыл окно браузера, не отключившись вручную (кнопкой отключения)...

Это событие socket.io запускается только тогда, когда пользователь отключается, а не когда он потерял соединение.

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

Мне нужен действительно хороший механизм, чтобы следить за пользователями, чтобы обновлять список моих онлайн-пользователей.


person TaLha Khan    schedule 30.04.2013    source источник


Ответы (1)


И какая разница? Закрытие окна, перерезание ethernet-провода... для сервера все равно: конец соединения.

Чтение документов socket.io: https://github.com/LearnBoost/socket.io/wiki/Exposed-events

socket.on('disconnect', function() {}) - событие разъединения срабатывает во всех случаях, когда соединение клиент-сервер закрыто. Он срабатывает при разыскиваемых, нежелательных, мобильных, немобильных, клиентских и серверных разъединениях.

Вы не должны полагаться на свою кнопку, так как люди могут отключиться, не используя эту кнопку. Используйте событие разъединения, и как только сокет отключится (сокет, а не пользователь, потому что Node просто знает о сокетах), вам нужно будет выяснить, кто был «владельцем» этого сокета, и пометить его как «отключенный». Или, что еще лучше, подождите несколько секунд, а затем отметьте его как не в сети. Почему? Потому что событие отключения сработает, даже если пользователь просто перезагрузит страницу или перейдет на другую. Поэтому, если вы подождете несколько секунд, пользователь снова будет в сети.

У меня тоже была эта проблема, и в итоге я создал «наблюдатель», который запускается каждые X секунд и помечает пользователей как не в сети, когда у них нет сокета или когда они, кажется, отсутствуют (нет активности в течение длительного времени).

person Salvatorelab    schedule 30.04.2013
comment
Хорошо... я понимаю, что события "отключения" работают, но через 10-15 секунд, поэтому сначала я думал, что этого никогда не произойдет... мой плохой. - person TaLha Khan; 30.04.2013
comment
как получить отключенный пользовательский session.id ..? - person TaLha Khan; 30.04.2013
comment
Получение отключенного пользователя session.id объясняется "> stackoverflow.com/questions/8286683/ - person TaLha Khan; 30.04.2013
comment
в зависимости от того, какой реальный транспортный метод использует socket.io (веб-сокеты, флэш-память, долгий опрос...), событие сработает мгновенно или через несколько секунд. Если вы используете современный браузер с поддержкой веб-сокетов и хорошее подключение к Интернету, disconnect должно сработать за миллисекунды! - person Salvatorelab; 30.04.2013
comment
на самом деле документация довольно неясна. во-первых, ссылка выше не была перемещена в документ Automattic, в котором мало подробностей о вентиляционных отверстиях. По крайней мере, не более того, что можно найти на socket.io. Попытка присоединения к перечисленным там событиям не приводит к отключению клиента. Ну что ж - person gesell; 18.06.2014