处理Sinatra应用程序中的事件流连接

有一个使用 Konstantin Haase的服务器发送事件的聊天应用程序的一个很好的例子 。 我试图运行它并遇到回调问题(我使用Sinatra 1.3.2并使用Chrome 16浏览)。 它们根本不运行(例如在页面重新加载之后),因此连接数量正在增长。

此外,连接在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 

这是Sinatra的一个错误https://github.com/sinatra/sinatra/issues/446

整齐的代码。 但你是对的,WebSockets会解决这些问题。 我认为这里有两个问题:

1)您的浏览器,Web服务器或中介之间的代理可能会在一段时间后关闭您的连接,无论是否空闲。 您建议定期计时器发送空数据会有所帮助,但不能保证。

2)据我所知,没有内置的方法来判断其中一个连接是否仍在工作。 为了保持您的连接列表不增长,您将不得不跟踪每个连接最后“使用”的时间(也许客户端应该偶尔ping通,并且您将存储此日期时间。)然后添加一个定期计时器来检查为了和杀死“陈旧”的联系。

更简单但更丑陋的选择是存储每个连接的创建时间,并在n分钟后将其终止。 客户端应该足够聪明才能重新连接。

我知道这需要一些简单的代码。 尽管示例很简洁,但我认为它更适合WebSockets。