我知道Celloloid的卷轴的存在(“卷轴是一个快速,非阻塞”事件的Web服务器,构建在Celluloid之上:IO“…并直接支持websockets),但是我仍然希望继续使用Sinatra因为我喜欢它,我已经习惯了,我宁愿不重写很多代码…
希望你能帮忙.
解决方法
这个即将被释放到卷轴的主分支,但是现在是在一个halgorium的叉子的分支,在这里:
https://github.com/halorgium/reel/tree/hijacked-websocket
这个问题正在进行中:
https://github.com/celluloid/reel/issues/42
此功能的实现涉及与Sinatra下的Rack中的劫持API相关的新功能和稍微临时功能的交互.这是相当复杂的,但一旦你得到它的悬念,它是很酷.这方面的完整信息在这里:
…where it all got decided in a github thread: 07003
根据@rhk,没有正式支持WebSockets通过Rack劫持Sinatra,除了中间件,没有计划.所以它将永远是你选择性地处理的,基于你的服务器和实现风格的选择.
我处理的方式是使用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,但正如我所说,这是很有机架的.那里没有太多的Sinatra代码,因为它不是真正的Sinatra的东西.再次,正如我所提到的,它甚至没有真正计划变得无缝.这将是一个sinatra / contrib的东西或其他一些中间件.所以这里是我的方式,在一个我使用hijack_io的情况下,作为一个粗略的草图.
…a gist: 07007