2013-05-14 46 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 

但在我的測試中,當我關閉頁面作爲測試時它並沒有觸發(在我的例子中,如果代碼被觸發,控制檯上有一些東西,並且沒有任何內容輸出到控制檯)。

有沒有更可靠的方法來檢測用戶是否離開流?此外,我沒有使用socket.io(客戶端)或任何東西,但我打開它,如果它解決了我的問題。

+0

和sinata版本? – 2013-05-14 07:55:06

+0

@SirScript我使用Thin(或WEBrick進行開發)和Sinatra 1.4.2 – Piccolo 2013-05-15 01:16:23

+0

http://www.sinatrarb.com/intro.html:「有些服務器,如WEBRick,甚至可能根本不支持流式傳輸。」 – utapyngo 2013-05-31 13:25:07

回答

2

基於chat.rb示例,我將創建一個小型協議來交換數據,而不僅僅是乾淨的聊天消息。

使用這種方法,您可以爲每個連接發送一個「活動信號」並清除所有不響應的信號。

我適應了一點chat.rb來說明這個想法:https://gist.github.com/tlewin/5708745你使用哪個服務器

+0

非常感謝!這是一個非常好的實現。我可以在什麼許可下使用此代碼(不是直接複製)?我計劃在MIT許可證下發布這個項目,這樣對你會好嗎?我會確保給你歸屬。 – Piccolo 2013-06-05 01:20:25

+0

麻省理工學院適合我!如果你需要什麼,請告訴我! – 2013-06-05 11:06:12