2012-01-03 3 views
0

От Konstantin Haase находится a great example of a chat app using Server-Sent Events. Я пытаюсь запустить его и иметь проблемы с обратными вызовами (я использую Sinatra 1.3.2 и просматриваю Chrome 16). Они просто не запускаются (например, после перезагрузки страницы), и поэтому число подключений растет.Обработка событий-потоков в приложении Sinatra

Кроме того, соединение закрывается в течение 30-60 секунд, если не установить периодический таймер для отправки пустых данных, как это было предложено Константином в другом месте.

Можете ли вы его повторить? Если да, можно ли как-то исправить эти проблемы? WebSockets работают без сбоев в этом отношении ...

# ruby 
get '/stream', provides: 'text/event-stream' do 
    stream :keep_open do |out| 
    EventMachine::PeriodicTimer.new(20) { out << "data: \n\n" } # added 
    settings.connections << out 
    puts settings.connections.count # added 
    out.callback { puts 'closed'; settings.connections.delete(out) } # modified 
    end 
end 

# javascript 
    var es = new EventSource('/stream'); 
    es.onmessage = function(e) { if (e.data != '') $('#chat').append(e.data + "\n") }; // modified 

ответ

1

Чистый код. Но вы правы, WebSockets будет решать эти проблемы. Я думаю, что здесь есть две проблемы:

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

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

Проще, хотя, возможно, уродливый вариант - хранить время создания каждого соединения и убивать его через n минут. Клиент должен быть достаточно умным, чтобы повторно подключаться.

Я знаю, что это требует некоторой простоты из кода. В качестве примера я считаю, что это лучший кандидат для WebSockets.