10

嗨,有人知道如何放置一个在Celluloid:IO之上运行并使用 websocket 的 Sinatra 应用程序的快速代码示例吗?

我知道用于赛璐珞的 Reel 的存在(“Reel 是建立在 Celluloid:IO 之上的快速、非阻塞的‘事件’网络服务器” ......并且立即支持 websockets)但我还是想继续使用Sinatra,因为我喜欢它,我已经习惯了它,我宁愿不重写很多代码......

希望你能帮忙。

4

1 回答 1

8

Celluloid::IO 有一个名为Reel ( http://github.com/celluloid/reel ) 的事件 HTTP/WebSocket 服务器,这是您想要的最佳设置,但除了 Thin 和 Rainbows 之外,这仍然是相当新的。这超出了 Sinatra 并且必须涉及Rack本身。到目前为止,它一直是特定于某些 HTTP 服务器的,并且每个“机架处理程序”都以自己的方式接近 WebSocket。现在它有点标准化了,但在 Rack 2.0 中它将成为永久性的。我猜这种临时的方式会保留下来,但在 2.0 中变得比现在在 +1.5.* 中更成熟。

这即将发布到 Reel 的 master 分支,但现在在 halgorium 的 fork 的一个分支中,这里:

https://github.com/halorgium/reel/tree/hijacked-websocket

这个问题的持续进展是在这里:

https://github.com/celluoid/reel/issues/42

此功能的实现涉及与在 Sinatra 下的 Rack 中称为劫持API 的相当新且有些临时的功能进行交互。它相当复杂,但一旦你掌握了它,它就很酷了。这方面的完整信息在这里:

...这一切都在 github 线程中决定: https ://github.com/rack/rack/pull/481

根据@rhk 的说法,目前还没有通过 Sinatra 的 Rack 劫持对 WebSockets 的正式支持,而且除了中间件之外没有任何计划。因此,根据您的服务器和实施风格的选择,它始终是您有选择地处理的事情。

我处理它的方式是使用 Reel,但Puma ( http://puma.io ) 也非常好。任何支持 hijack_io 的 HTTP 服务器都将运行相同的操作。我这样做的方式在下面链接的要点中进行了说明。它使用websocket-protocol-ruby来实际处理与客户端的交互,在客户端,我使用 portal.js 而不仅仅是普通的 HTML5 方法。我相信它会好很多。

Portal.js: https ://github.com/flowersinthesand/portal

websocket-protocol-ruby: https ://github.com/faye/websocket-protocol-ruby

正如 github 上的 Rack API 线程中所提到的,这一切都取决于这一部分:

env['rack.hijack'].call
@env = env
@io = env['rack.hijack_io']

hijack_io 有两种使用方式,但正如我所说,它非常涉及 Rack。那里没有太多的 Sinatra 代码,因为它不是真正的 Sinatra 东西。同样,正如我所提到的,它甚至没有真正计划变得无缝。这将是一个 sinatra/contrib 的东西或其他一些中间件。所以这是我的方式,在我使用 hijack_io 的一个例子中,作为一个粗略的草图。

...要点: https ://gist.github.com/digitalextremist/5441315

于 2013-04-18T06:05:30.787 回答