Sinatra + websocket +赛璐珞

jj_*_*jj_ 10 concurrency sinatra websocket celluloid

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

我知道Reel for Celluloid的存在("Reel是一个基于Celluloid:IO建立在基础上的快速,无阻塞'的'服务'网络服务器 ......并且直接支持webockets)但是我仍然想继续使用Sinatra因为我喜欢它,我已经习惯了它,我宁愿不重写很多代码......

希望你能帮忙.

dig*_*ist 8

Celluloid :: IO有一个名为Reel的 HTTP/WebSocket服务器(http://github.com/celluloid/reel),这是你想要的最好的设置,但是,除了Thin和Rainbows之外,这是一个非常新的.这超出了Sinatra,并且必须涉及Rack本身.到目前为止,它已经特定于某些HTTP服务器,并且每个"Rack Handler"都以自己的方式接近WebSockets.现在它有点标准化,但在Rack 2.0中它将成为永久性的.我猜这种暂时的方式将继续存在,但在2.0中变得比在+ 1.5中更成熟.*现在.

这将即将发布到Reel的主分支中,但现在位于halgorium的fork分支中,这里:

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

这个问题的持续进展如下:

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

此功能的实现涉及与在Sinatra下面的Rack中的hijack API 相互作用的新功能和稍微临时的功能进行交互.这是相当复杂的,但一旦你掌握了它,它是非常酷的.完整的信息在这里:

...在github线程中确定了所有内容: https ://github.com/rack/rack/pull/481

据@rhk称,目前还没有正式支持通过Rack劫持Sinatra的WebSockets,除了Middleware之外没有任何计划.因此,根据您的服务器和实施方式的选择,它将始终是您有选择地处理的内容.

我处理它的方式是使用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']
Run Code Online (Sandbox Code Playgroud)

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

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