我有一个Ruby应用程序和Puma一起运行。现在,我想添加一个websocket来向连接的客户端广播REST请求。我只在我的config.ru中添加了一些代码,就成功地用em-websocket创建了一个websocket服务器:
require_relative 'config/environment'
require 'em-websocket'
Socket = EM.run {
@channel = EM::Channel.new
EventMachine::WebSocket.start(:host => "0.0.0.0", :port => 2929, :debug => true) do |ws|
ws.onopen {
sid = @channel.subscribe { |msg| ws.send msg }
@channel.push "#{sid} connected!"
ws.onmessage { |msg|
@channel.push "blubb"
}
ws.onclose {
@channel.unsubscribe(sid)
}
}
end
}
run Rails.application现在的问题是,当我运行'rails服务器-b 0.0.0.0‘时,websocket正在运行,而我的应用程序却没有运行。当连接到localhost:3000时,我会超时。我能做些什么才能让他们在一起?
后续问题:如何通过websocket向连接的客户端广播?我考虑在REST请求的控制器中添加一个广播方法。这有可能吗?
发布于 2017-03-14 20:47:21
要让Rails HTTP和Websocket服务共享相同的端口,我知道有两个选项:
iodine+plezi)。我假设第二种解决方案更合适,尽管它需要您将代码从em-websockets移植到其他解决方案(即Faye或碘/Plezi)。
我应该注意到,基准测试显示了可能在压力下崩溃,过度消耗CPU。。
我是碘的作者,所以我有偏见,我相信这是一个比大多数Ruby替代方案更好的解决方案(一些基准同意)。碘利用建议的(而且可能被放弃的) Rack-Websocket规范,因此HTTP和Websocket连接共享相同的服务器和IO反应堆,从而实现更好的资源管理。
但是,您也可以使用Faye,Faye(类似于当前的ActionCable实现)从HTTP服务器劫持套接字,并在建立Websocket连接后将其附加到单独的IO反应器上。
https://stackoverflow.com/questions/42697330
复制相似问题