检测用户何时离开事件流

时间:2013-05-14 02:54:41

标签: ruby sinatra event-stream

我正在尝试使用Sinatra从头开始创建聊天室。我需要检测用户何时离开页面。起初,我正在考虑使用Javascript onbeforeunload函数,但是用户实际上可以假设离开或离开而不通知服务器。

我的流部分代码如下所示:

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

根据一个Sinatra示例文件chat.rb,它基本上是一个聊天室,他们使用

out.callback do
   connections.delete(out)
end

但是在我的测试中,当我关闭页面作为测试时它没有触发(在我的例子中,如果代码被触发,我向控制台发送了puts内容,并且没有输出任何内容控制台)。

是否有更可靠的方法来检测用户是否离开了流?

另外,我没有使用socket.io(客户端)或任何东西,但如果它能解决我的问题,我会对它开放。

1 个答案:

答案 0 :(得分:2)

基于chat.rb示例,我会创建一个小协议来交换数据,而不仅仅是干净的聊天消息。

使用这种方法,您可以为每个连接发送“活动信号”并清除所有没有响应的信号。

我稍微调整了一下chat.rb来说明这个想法:https://gist.github.com/tlewin/5708745