Sinatra + websocket + Celluloid

10

大家好,有人知道如何快速编写一个Sinatra应用程序的示例,并在Celluloid:IO上运行并使用websocket吗?

我知道Reel适用于Celluloid(“Reel是一个基于Celluloid:IO构建的快速、非阻塞的'事件驱动'Web服务器”...并且立即支持websockets),但我仍然希望继续使用Sinatra,因为我喜欢它、习惯了它,并且不想重写很多代码...

希望你们能帮忙。


如果您发布一些现有的代码,我可能可以帮助调整您的代码,如果您查看下面我的便笺,并发布其中一个您现有的情况。 - digitalextremist
1
我以为它应该更简单...而且现在我没有时间测试它。但是我很感激你的全面回答,所以在此期间我要感谢你并点赞。 - Redoman
1
没问题。实际上,这是一个泥潭,直到你使用像我提出的方法之一。但这只是众多风格中的一种。一旦你有时间测试它,我认为你会对我展示的方法感到舒适。如果不行,请发表你的意见。然而,我已经对Sinatra和Rack感到厌烦了,因此我已经开始制作一个易于更换的替代品,这将通过支持所有Sinatra和Rack代码来改变你的问题的答案,除了<Sinatra::Base...这将被更改为Reaf::Scope。这应该是你需要更改的全部内容。http://github.com/penultimatix/reaf - digitalextremist
1个回答

8

Celluloid::IO有一个称为Reel的事件驱动的HTTP/WebSocket服务器(http://github.com/celluloid/reel),这是最适合您想要的内容的设置,但是,这还是相当新的,除了Thin和Rainbows之外。这超出了Sinatra并且必须牵涉到Rack本身。到目前为止,它已经特定于某些HTTP服务器,并且每个“Rack处理程序”都以自己独有的方式处理WebSockets。现在它在某种程度上已经标准化,但在Rack 2.0中它将变得永久。我猜测这种临时方式将保持不变,但在2.0中会比+1.5.*成熟得多。

这将发布到Reel的主分支中,但现在在halgorium的分支中,链接如下:

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

此问题的进行进展可以在此处找到:

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

实现此功能涉及与Rack中名为hijack的相当新且有点临时的功能进行交互,底层运行在Sinatra之下。它相当复杂,但一旦你掌握了它,就非常酷。完整的信息在这里:

...所有决定都在github线程中做出: https://github.com/rack/rack/pull/481

目前还没有针对Sinatra的Rack hijack WebSocket的正式支持,根据@rhk的说法,也没有计划提供除Middleware外的支持。因此,它将始终是一些基于您的服务器和实施样式选择性地处理的内容。

我处理它的方式是使用Reel,但Puma (http://puma.io) 也非常好。任何hijack_io能力的HTTP服务器都将以相同的方式操作。我处理它的方式在下面链接的gist中说明。它使用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的两种方法

有两种使用hijack_io的方法,但正如我所说,这与Rack紧密相关。由于它并不是真正的Sinatra事物,因此没有太多的Sinatra代码。再次提到,它甚至并没有计划变得无缝。它将成为一个sinatra/contrib事物或其他中间件。

下面是我使用hijack_io的一种方式,仅供参考:

...一个代码片段: https://gist.github.com/digitalextremist/5441315


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接