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

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

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

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

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

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

Ответ 1

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

Чтение socket.io docs: https://github.com/LearnBoost/socket.io/wiki/Exposed-events

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

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

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