Ruby 在Sinatra应用程序中处理事件流连接
还有康斯坦丁·哈斯的作品。我正在尝试运行它,但回调有问题(我使用Sinatra 1.3.2并使用Chrome 16浏览)。它们只是不运行(例如,在重新加载页面之后),因此连接的数量正在增加 此外,连接会在30-60秒内关闭,除非像Konstantin在其他地方建议的那样,设置一个定期定时器来发送空数据 你能复制它吗?如果是,是否有可能以某种方式解决这些问题?WebSocket在这方面可以无缝地工作Ruby 在Sinatra应用程序中处理事件流连接,ruby,html,sinatra,websocket,server-sent-events,Ruby,Html,Sinatra,Websocket,Server Sent Events,还有康斯坦丁·哈斯的作品。我正在尝试运行它,但回调有问题(我使用Sinatra 1.3.2并使用Chrome 16浏览)。它们只是不运行(例如,在重新加载页面之后),因此连接的数量正在增加 此外,连接会在30-60秒内关闭,除非像Konstantin在其他地方建议的那样,设置一个定期定时器来发送空数据 你能复制它吗?如果是,是否有可能以某种方式解决这些问题?WebSocket在这方面可以无缝地工作 # ruby get '/stream', provides: 'text/event-strea
# 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
#ruby
获取“/stream”,提供“文本/事件流”do
溪流:请勿入内|
EventMachine::PeriodicTimer.new(20){out整洁的代码。但是你是对的,WebSocket可以解决这些问题。我认为这里有两个问题:
1) 您的浏览器、Web服务器或两者之间的代理可能会在一段时间后关闭您的连接,不管是否空闲。您建议定期使用计时器发送空数据会有所帮助,但不能保证
2) 据我所知,没有内置的方法来判断其中一个连接是否/何时仍在工作。为了防止连接列表增长,您必须跟踪每一个连接上次“使用”的时间(也许客户端应该偶尔ping一下,然后存储这个datetime)然后添加一个定期计时器来检查和终止“过时”的连接
一个更简单但可能更丑陋的选择是存储每个连接的创建时间,并在n分钟后将其终止。客户端应该足够聪明,可以重新连接
我知道这会让代码变得简单一些。尽管示例很简洁,但我认为它更适合WebSocket。简洁一点的代码。但是你是对的,WebSocket可以解决这些问题。我认为这里有两个问题:
1) 您的浏览器、Web服务器或两者之间的代理可能会在一段时间后关闭您的连接,不管是否空闲。您建议定期使用计时器发送空数据会有所帮助,但不能保证
2) 据我所知,没有内置的方法来判断其中一个连接是否/何时仍在工作。为了防止连接列表增长,您必须跟踪每一个连接上次“使用”的时间(也许客户端应该偶尔ping一下,然后存储这个datetime)然后添加一个定期计时器来检查和终止“过时”的连接
一个更简单但可能更丑陋的选择是存储每个连接的创建时间,并在n分钟后将其终止。客户端应该足够聪明,可以重新连接
我知道这会让代码变得简单一些。尽管示例很简洁,但我认为它更适合WebSocket。这是Sinatra中的一个bug这是Sinatra中的一个bug