1

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

此外,连接会在 30-60 秒内关闭,除非按照 Konstantin 在其他地方的建议,设置定期计时器来发送空数据。

你能复制它吗?如果是,是否有可能以某种方式解决这些问题?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
4

2 回答 2

3

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

于 2012-01-06T09:45:14.567 回答
2

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

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

2)据我所知,没有内置方法可以判断这些连接之一是否/何时仍在工作。为了防止你的连接列表增长,你必须记录每个连接最后一次“使用”的时间(也许客户端应该偶尔 ping,你会存储这个日期时间。)然后添加一个定期计时器来检查并杀死“陈旧”的连接。

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

我知道这会使代码变得简单。与示例一样简洁,我认为它是 WebSockets 的更好候选者。

于 2012-01-03T22:07:04.073 回答