寻找可以追溯到长轮询的Ruby Web Socket库

时间:2012-01-27 06:18:46

标签: ruby websocket long-polling eventmachine

我目前正在使用em-websocket和Event Machine。它工作得很好,但我也想为不支持Web套接字的浏览器提供长轮询和/或Flash后备(以及我也可以在Heroku上运行它)。

我基本上是在寻找一个Ruby版本的Socket.IO,或者足够的库来拼凑起来以获得我想要的功能。我见过一些使用Socket.IO,Redis和一个与Redis DB交互的Ruby库的例子,但我宁愿保持简单,只需将它全部保存在Event Machine中,而不是必须管理3个应用程序一个。

3 个答案:

答案 0 :(得分:3)

答案 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(通过中间件,通过不同的应用程序或通过不同的端口访问)。

...但是,对于每个人,我猜。