Ответ 1
И какая разница? Закрытие окна, прорезание проводов Ethernet... это все равно для сервера: конец соединения.
Чтение socket.io docs: https://github.com/LearnBoost/socket.io/wiki/Exposed-events
socket.on('disconnect', function() {}) - событие разъединения запускается во всех случаях, когда соединение клиент-сервер закрывается. Он запускается на разыскиваемых, нежелательных, мобильных, немобильных, клиентских и серверных разъединителях.
Вы не должны полагаться на свою кнопку, так как люди могут отключиться, не используя эту кнопку. Используйте событие разъединения и, как только сокет отключится (сокет, а не пользователь, причина Node только знает о сокетах), вам нужно будет выяснить, кто был "владельцем" этого сокета, и отметить его как "отключенный". Или еще лучше, подождите несколько секунд, а затем отметьте его как офлайн. Зачем? Поскольку событие разъединения будет срабатывать, даже если пользователь просто перезагрузит страницу или перейдет к другой. Поэтому, если вы подождете несколько секунд, пользователь снова будет в сети.
У меня тоже была эта проблема, и я закончил создание "наблюдателя", который запускает каждые X секунд и помещает пользователей в автономном режиме, когда у них нет сокета или когда они, кажется, уходят (долгое время нет активности).