我目前正在使用em-websocket和Event Machine。它工作得很好,但我也想为不支持Web套接字的浏览器提供长轮询和/或Flash后备(以及我也可以在Heroku上运行它)。
我基本上是在寻找一个Ruby版本的Socket.IO,或者足够的库来拼凑起来以获得我想要的功能。我见过一些使用Socket.IO,Redis和一个与Redis DB交互的Ruby库的例子,但我宁愿保持简单,只需将它全部保存在Event Machine中,而不是必须管理3个应用程序一个。
答案 0 :(得分:3)
查看Faye - https://github.com/faye/faye。
答案 1 :(得分:2)
您可以在客户端使用Socket.IO,在服务器端使用async_sinatra和Thin执行em-websocket。有关该主题的一些信息,请参阅here。
答案 2 :(得分:0)
我正在寻找同样的东西,最后编写了Plezi websocket framework,我想让它更容易,更直观地使用......你甚至可以在你的Rails / Sintra应用程序中使用它(它将取代你的Rack服务器Iodine如果您这样做,并且两个应用程序将共享相同的网络连接和进程)...
一个简单的websocket chat / echo服务器 - 在websocket echo示例页面上运行 - 看起来像这样:
require 'plezi'
class BroadcastCtrl
def index
redirect_to 'http://www.websocket.org/echo.html'
end
def on_message data
# the following two lines are the same as:
# self.class.broadcast :_send_message, data
broadcast :_send_message, data
_send_message data
end
def _send_message data
response << data
end
end
route '/', BroadcastCtrl
由于框架支持RESTful HTTP和HTTP Streaming,因此对于长期回退位置来说非常舒适。
您还可以查看Plezi客户端或使用任何Plezi's Auto-Dispatch功能将任何JSON event
自动分派给方法。这使得为Websockets和AJAX(实际上是AJAJ)编写API非常容易。
这里是一个更复杂的例子,展示自动调度,一些递归方法调用(使用广播,将数据写入所有连接的客户端),AJAX vs Websoocket识别,仅http请求和仅限websocket事件。
require 'plezi'
class BroadcastCtrl
@auto_dispatch = true
def index event = nil
{event: 'update', target: 'body',
data: 'my content'}.to_json
end
def chat event = nil, broadcast = false
if broadcast # it's recursive broadcasting
return write(event.to_json)
end
if event == nil #it's AJAX
msg = params[:msg]
else # it's websockets
msg = event[:msg]
end
self.class.broadcast :chat, ({event: 'chat', msg: msg}), true
end
def http_only
{event: 'foo', data: 'bar'}.to_json
end
protected
def websocket_only event
{event: 'foo', data: 'bar'}.to_json
end
end
route '/', BroadcastCtrl
该框架还支持简单和原生的Redis集成,因此广播可以无缝地传播到不同的进程或机器。
它还支持slim,haml,sass,coffee-script和hrb模板,因此可以将整个应用程序移动到一个框架,而不是使用并行实时解决方案运行Sinatra / Rails(通过中间件,通过不同的应用程序或通过不同的端口访问)。
...但是,对于每个人,我猜。