2013-04-30 2 views
10

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

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

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

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

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

ответ

15

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

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

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

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

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

+1

Хорошо, я понял, что события «разъединения» работают, но через 10-15 секунд, поэтому сначала я подумал, что это никогда не произойдет ... мое плохое. –

+0

Как получить отключенного пользователя session.id ..? –

+2

Обнаружен отключенный пользователь session.id http://stackoverflow.com/questions/8286683/socket-id-of-disconnecting-client?answertab=active#tab-top –

Смежные вопросы