2013-05-14 5 views
1

Я пытаюсь создать чат с нуля, используя Sinatra. Мне нужно определить, когда пользователь покидает страницу. Сначала я думал об использовании функции Javascript onbeforeunload, но тогда пользователи могли на самом деле подделывать уйти или оставить без уведомления сервера.Обнаруживать, когда пользователь покидает поток событий

Мой код для потока части выглядит следующим образом:

get '/stream', :provides => 'text/event-stream' do 
    stream :keep_open do |out| 
    connections << out 
    end 
end 

Согласно одному из примеров файлов Синатры, chat.rb, который в основном делает комнату, они используют

out.callback do 
    connections.delete(out) 
end 

но в моем тесте он не срабатывал, когда я закрывал страницу как тест (в моем примере у меня было puts что-то на консоль, если код был запущен, и ничего не выводилось на консоль).

Есть ли более надежный способ определить, покидает ли пользователь поток?

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

+0

, какой сервер вы используете и какой sinata версии? –

+0

@SirScript Я использую Thin (или WEBrick для разработки) и Sinatra 1.4.2 – Piccolo

+0

http://www.sinatrarb.com/intro.html: «Некоторые серверы, такие как WEBRick, могут даже не поддерживать потоковое вещание». – utapyngo

ответ

2

Основываясь на примере chat.rb, я бы создал небольшой протокол для обмена данными, а не просто чистые сообщения чата.

При таком подходе вы можете отправить «живой сигнал» для каждого соединения и очистить все, что не отвечает.

Я приспособил немного в chat.rb, чтобы проиллюстрировать идею: https://gist.github.com/tlewin/5708745

+0

Большое спасибо! Это действительно хорошая реализация. Какую лицензию можно использовать в этом коде (не скопировано напрямую)? Я планировал выпустить этот проект под лицензией MIT, это было бы хорошо с вами? Я обязательно расскажу вам об атрибуции. – Piccolo

+0

MIT в порядке для меня! Если вам что-то нужно, дайте мне знать! –

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