Sinatra与EventMachine WebSockets一起使用可以取得成功吗?
我一直在使用Sinatra,现在我想通过websocket推送一些数据给我的networking应用程序添加一些实时function。
我已经成功地使用了gem'em-websocket',但是还没有能够编写一个具有sinatra web服务器和web-socket服务器的ruby文件。
我已经尝试了旋转! 或开始! 方法closures在单独的线程中没有成功。
有没有人得到这个工作?
我想让他们在同一个文件中,然后在两台服务器之间共享variables。
谢谢!
没有尝试,但不应该太难:
require 'em-websocket' require 'sinatra/base' require 'thin' EM.run do class App < Sinatra::Base # Sinatra code here end EM::WebSocket.start(:host => '0.0.0.0', :port => 3001) do # Websocket code here end # You could also use Rainbows! instead of Thin. # Any EM based Rack handler should do. Thin::Server.start App, '0.0.0.0', 3000 end
另外, Cramp有一个websocket实现,可以直接使用Thin / Rainbows。 你可能会提取,所以你甚至不需要在另一个端口上运行服务器。
感谢康斯坦丁…这工作! 我不得不微调你的代码。 我添加了评论,我改变了它。
-poul
require 'rubygems' # <-- Added this require require 'em-websocket' require 'sinatra/base' require 'thin' EventMachine.run do # <-- Changed EM to EventMachine class App < Sinatra::Base get '/' do return "foo" end end EventMachine::WebSocket.start(:host => '0.0.0.0', :port => 8080) do |ws| # <-- Added |ws| # Websocket code here ws.onopen { ws.send "connected!!!!" } ws.onmessage { |msg| puts "got message #{msg}" } ws.onclose { ws.send "WebSocket closed" } end # You could also use Rainbows! instead of Thin. # Any EM based Rack handler should do. App.run!({:port => 3000}) # <-- Changed this line from Thin.start to App.run! end
我偶然发现了这个websocket-rack github项目,该项目基本上是一个虚拟的web -websocket ,实际上它和Sinatra应用程序并行地工作。 这是我的config.ru:
require 'rubygems' require 'rack/websocket' require 'sinatra/base' class WebSocketApp < Rack::WebSocket::Application # ... end class SinatraApp < Sinatra::Base # ... end map '/ws' do run WebSocketApp.new end map '/' do run SinatraApp end
玩的开心!
科林
我一直在使用sinatra-websocket 。 让你在相同的进程中运行websocket服务器,并在与Sinatra相同的端口上运行。
免责声明:我是维护者。
require 'sinatra' require 'sinatra-websocket' set :server, 'thin' set :sockets, [] get '/' do if !request.websocket? erb :index else request.websocket do |ws| ws.onopen do ws.send("Hello World!") settings.sockets << ws end ws.onmessage do |msg| EM.next_tick { settings.sockets.each{|s| s.send(msg) } } end ws.onclose do warn("websocket closed") settings.sockets.delete(ws) end end end end __END__ @@ index <html> <body> <h1>Simple Echo & Chat Server</h1> <form id="form"> <input type="text" id="input" value="send a message"></input> </form> <div id="msgs"></div> </body> <script type="text/javascript"> window.onload = function(){ (function(){ var show = function(el){ return function(msg){ el.innerHTML = msg + '<br />' + el.innerHTML; } }(document.getElementById('msgs')); var ws = new WebSocket('ws://' + window.location.host + window.location.pathname); ws.onopen = function() { show('websocket opened'); }; ws.onclose = function() { show('websocket closed'); } ws.onmessage = function(m) { show('websocket message: ' + m.data); }; var sender = function(f){ var input = document.getElementById('input'); input.onclick = function(){ input.value = "" }; f.onsubmit = function(){ ws.send(input.value); input.value = "send a message"; return false; } }(document.getElementById('form')); })(); } </script> </html>
仅供参考,您还可以在EventMachine上使用Padrino应用程序(因为它们是Sinatra应用程序的子集):
require 'rubygems' require 'eventmachine' require 'padrino-core' require 'thin' require ::File.dirname(__FILE__) + '/config/boot.rb' EM.run do Thin::Server.start Padrino.application, '0.0.0.0', 3000 end
干杯,迈克