2012-01-03 51 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)您的瀏覽器,Web服務器或中間代理可能會在一段時間後關閉連接,閒置或不在。您的定期計時器發送空數據的建議將有所幫助,但不能保證。

2)據我所知,沒有內置的方法來判斷這些連接之一是否仍然有效。爲了讓連接列表不斷增長,你將不得不跟蹤每個連接何時最後被「使用」(也許客戶端應該偶爾ping,並且你會存儲這個日期時間)。然後添加一個定期計時器來檢查並且殺死「陳舊」的連接。

一個更容易,但也許更醜陋的選擇是存儲每個連接的創建時間,並在n分鐘後關閉它。客戶端應該足夠聰明以重新連接。

我知道這需要一些簡單的代碼。就像這個例子一樣,我認爲這是WebSockets的更好的選擇。