首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从rails运行器内部触发/订阅websocket-rails事件

从rails运行器内部触发/订阅websocket-rails事件
EN

Stack Overflow用户
提问于 2015-06-27 08:10:20
回答 1查看 844关注 0票数 0

我有一个带有websocket-rails gem的Rails应用程序。

在我的应用程序中,有一个我用rails runner MyDaemon.start启动的守护进程

我使用的是websocket-rails Synchronization,所以我的config/initializers/websocket_rails.rb是这样的:

代码语言:javascript
复制
WebsocketRails.setup do |config|
  config.log_internal_events = false
  config.standalone = false
  config.synchronize = true
end

MyDaemon内部,使用同步,我可以触发同时到达我的WebsocketRails::BaseController和javascript WebSocketRails的事件。

我想要做的是找到一种方法来绑定我的MyDaemon中的事件。

我曾尝试使用faye-websocket-rubywebsocket-client-simple来实现一个普通的WebSocket客户端,但是经过一段时间的摸索之后,我发现使用client_connected消息中的connection_id进行了某种“握手”过程。基本上,this other so question中提供的解决方案都不适合我。

我需要了解在我的MyDaemon中是否可以直接订阅一些WebsocketRails回调,甚至在EventMachine中也可以,或者我应该如何在Ruby语言中实现一个Websocket客户端。

我最后一次尝试使用ruby客户端可以在this gist中找到,下面是一个示例输出:

代码语言:javascript
复制
ruby client.rb ws://localhost:3000/websocket
[:open, {"upgrade"=>"websocket", "connection"=>"Upgrade", "sec-websocket-accept"=>"zNTdGvxFKJeP+1PyGf27T4x2PGo="}]

JSON message is
[["client_connected", {"id"=>nil, "channel"=>nil, "user_id"=>nil, "data"=>{"connection_id"=>"4b7b91001befb160d17b"}, "success"=>nil, "result"=>nil, "token"=>nil, "server_token"=>nil}]]

client id is 4b7b91001befb160d17b
[:message, "[[\"client_connected\",{\"id\":null,\"channel\":null,\"user_id\":null,\"data\":{\"connection_id\":\"4b7b91001befb160d17b\"},\"success\":null,\"result\":null,\"token\":null,\"server_token\":null}]]"]

JSON message is
[["websocket_rails.ping", {"id"=>nil, "channel"=>nil, "user_id"=>nil, "data"=>{}, "success"=>nil, "result"=>nil, "token"=>nil, "server_token"=>nil}]]

Sending ["pong",{}]
[:message, "[[\"websocket_rails.ping\",{\"id\":null,\"channel\":null,\"user_id\":null,\"data\":{},\"success\":null,\"result\":null,\"token\":null,\"server_token\":null}]]"]
[:close, 1006, ""]

websocket-rails的日志是:

代码语言:javascript
复制
I [2015-06-27 02:08:45.250] [ConnectionManager] Connection opened: #<Connection::2b3dddaf3ec4ed5e3550>
I [2015-06-27 02:08:45.251] [Dispatcher] Started Event: client_connected
I [2015-06-27 02:08:45.251] [Dispatcher] Name: client_connected
I [2015-06-27 02:08:45.251] [Dispatcher] Data: {"connection_id"=>"2b3dddaf3ec4ed5e3550"}
I [2015-06-27 02:08:45.251] [Dispatcher] Connection: #<Connection::2b3dddaf3ec4ed5e3550>
I [2015-06-27 02:08:45.251] [Dispatcher] Event client_connected Finished in 0.000174623 seconds
I [2015-06-27 02:09:05.252] [ConnectionManager] Connection closed: #<Connection::2b3dddaf3ec4ed5e3550>
I [2015-06-27 02:09:05.252] [Dispatcher] Started Event: client_disconnected
I [2015-06-27 02:09:05.252] [Dispatcher] Name: client_disconnected
I [2015-06-27 02:09:05.252] [Dispatcher] Connection: #<Connection::2b3dddaf3ec4ed5e3550>
I [2015-06-27 02:09:05.253] [Dispatcher] Event client_disconnected Finished in 0.000236669 seconds

也许我错过了一些非常愚蠢的东西,所以我在这里请求你的帮助!

EN

回答 1

Stack Overflow用户

发布于 2015-07-25 07:47:14

您可以使用I作为websocket客户端(我是作者):

代码语言:javascript
复制
require 'iodine/http'
# prevents the Iodine's server from running
Iodine.protocol = :timer
# starts Iodine while the script is still running
Iodine.force_start!
options = {}
options[:on_open] = Proc.new {puts 'Connection Open'; write "Hello World!" }
options[:on_close] = Proc.new {puts 'Connection Closed'}
options[:on_message] = Proc.new {|data| puts "I got: #{data}" }

# connect to an echo server for demo. Use the blocking method:
websocket = Iodine::Http::WebsocketClient.connect "wss://echo.websocket.org/", options
websocket << "sending data"
sleep 0.5
websocket.close

顺便说一句,我仔细阅读了一下,发现websocket-rails gem并没有太多的更新。请参阅this question

作为替代方案,您可以使用Plezi framework (我是作者)在Rails应用程序中运行websockets。

在同一台服务器上同时使用这两个框架非常容易。这样,您就可以在Plezi Websocket控制器中使用Rails模型的代码。

因为Plezi将管理websockets,而Rails可能会呈现404Not Found页面,因此Plezi的路由将优先...但只要你们的路由不互相覆盖,你们就是黄金。

请注意,为了允许这两个应用程序一起运行,Plezi将强制您使用Iodine server作为您的机架服务器。为了避免这种情况,您可以使用安慰剂API并在不同的进程上运行Plezi。

你可以阅读更多框架的README file

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31083829

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档