Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 在Sinatra应用程序中处理事件流连接_Ruby_Html_Sinatra_Websocket_Server Sent Events - Fatal编程技术网

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

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

还有康斯坦丁·哈斯的作品。我正在尝试运行它,但回调有问题(我使用Sinatra 1.3.2并使用Chrome 16浏览)。它们只是不运行(例如,在重新加载页面之后),因此连接的数量正在增加

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

你能复制它吗?如果是,是否有可能以某种方式解决这些问题?WebSocket在这方面可以无缝地工作

# 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