我已将plezi添加到Gemfile中并创建了这样的初始化程序:
#config/initializer/plezi.rb
class NewsPublisher
def on_open
binding.pry
end
end
route '/ws', NewsPublisher
当我尝试通过JS使用此代码new WebSocket("ws://127.0.0.1:3000/ws");
连接它时,我在客户端收到以下错误消息:Error during WebSocket handshake: Unexpected response code: 404
在服务器端,我有:ActionController::RoutingError (No route matches [GET] "/ws"):
有人可以解释如何在Rails app中使用plezi路由吗?
答案 0 :(得分:0)
在Plezi的getting started guide中,它指出:
如果您的控制器类定义了on_message(数据)回调,则plezi将自动为该路由启用websocket连接。
这个陈述应该可以在websockets和Rails指南中重复......但是我还在编写文档而且还不完整。
要确保Plezi为'/ws'
路由启用websockets,请添加on_message
回调(即使是空回调)。即:
#config/initializer/plezi.rb
class NewsPublisher
def on_open
binding.pry
end
def on_message data
puts "Websocket got: #{data}"
end
end
Plezi.route '/ws', NewsPublisher
如果您有任何问题,请告诉我。
编辑(从评论中添加更多信息)
Plezi使用Iodine作为服务器,绕过Rack的hijack
API(Iodine是Ruby的快速C扩展,它充当Rack服务器,支持本机websockets)。
在Plezi的guide to Plezi with Rails/Sinatra/Rack中,有人指出,在Rails / Sinatra / Rack中使用Plezi时:
只有一个问题 - 每个应用程序不能只有一个Web服务器。这意味着我们现有的Rack应用程序必须使用Plezi(实际上是Iodine)作为它的Web服务器。
确保从Gemfile中删除任何服务器(例如thin
,puma
,unicorn
等等。)
Apache(或Nginx)和Passenger怎么样?
Apache可以将请求转发给Iodine,就像代理服务器一样,类似于Apache与puma,passenger,unicorn,thin和其他应用服务器一起工作的方式。
可以使用Apache或Nginx,但不乘客。
性能
测试并查看。
Iodine是一个C扩展,它使用epoll
或kqueue
系统调用 - 这些调用非常快并且是为了并发而构建的。此外,Iodine有一个非常好的内存管理设计,其中传递给“Ruby-land”的Ruby对象通常被回收或清除以允许优化的性能......但这只是单词。只有一种方法可以知道 - 测试。