2012-01-03 49 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的更好的选择。