【问题标题】:Rails 5 app (Action Cable) as Socket.io server AND clientRails 5 应用程序(Action Cable)作为 Socket.io 服务器和客户端
【发布时间】:2016-09-19 19:53:41
【问题描述】:

我现在熟悉 Action Cable(Rails 5 功能)作为 websocket 的发射器或服务器。但是,我应该使用一个通过 websocket 发送数据的 API(例如 'socket.provider.com?token=12345')。

我使用 socket.io-client-simple (https://github.com/shokai/ruby-socket.io-client-simple) 对一个普通的 Ruby 文件进行了一些测试,它可以工作,但我不确定这将如何在已部署的 Rails 应用程序上工作。我猜我需要一个单独的进程来不断地监听 API 提供者发出的事件。有没有人做过类似的事情?我将使用 Heroku 进行部署。

注意:我认为使用客户端方法接收 websocket,然后将它们发布到我的 Rails 应用程序(即 Javascript Socket.IO 库)不是一种选择,因为我需要接收并保留一些即将到来的数据实时获取事件,而不依赖于至少一个客户端的连接。

我还想知道是否有任何方法可以自动将 Action Cable 设置为以某种方式充当“事件侦听器”。到目前为止还没有阅读任何关于该主题的内容,但希望看到有关该方向的一些建议。

更新:这是我目前用来连接到提供商的 websockets API 的 Ruby 代码:

require 'rubygems'
require 'socket.io-client-simple'

socket = SocketIO::Client::Simple.connect 'https://api.provider.com', token: '12345'

socket.on :connect do
  puts "connect!!!"
end

socket.on :disconnect do
  puts "disconnected!!"
end

socket.on :providerevent do |data|
  puts data
end

socket.on :error do |err|
  p err
end

puts "please input and press Enter key"
loop do
  sleep 100
end

【问题讨论】:

    标签: ruby-on-rails sockets heroku ruby-on-rails-5 actioncable


    【解决方案1】:

    ActionCable 不能自己监听外部站点的事件,因此您必须将 socket.io 和 ActionCable 结合起来。

    ActionCable 可以像这样向频道发送更新:

    ActionCable.server.broadcast "channel_name", param1: your_param1, param2: your_param2

    在事件发生时更新频道。这 received 您频道的咖啡脚本文件的操作是您必须对其进行处理的地方。 据我了解,您正在监听事件的控制器中寻找类似的东西:

    def listen
      socket.on :connect do
        # persist your data 
        # example: @post = Post.create(...)
        ActionCable.server.broadcast "channel_name", post_title: @post.title
      end
    end
    

    在您的 channel_name.coffee 中:

    received: (data) ->
      console.log(data["post_title"])
      # do something
    

    通过此设置,您将从 api 接收事件,并将其广播到您的频道。每次您的套接字接收到事件时,设置通道的页面都会更新。

    你应该先按照 DDH 的教程,然后你可能会更好地理解我的解决方案(这很容易实现)。

    【讨论】:

    • 嗨格雷厄姆,谢谢你的链接。我知道如何在生产中使用 ActionCable。我的问题是如何从我的 Rails 应用程序中主动监听 来自外部提供者的套接字事件。这意味着,我的应用不仅会发出从我的应用本身生成的事件,而且还会接收由外部 API 生成的事件。
    • 外部 api 是否向您应用中的端点发送请求/事件?
    • 不,我必须通过连接到它们的端点来监听它们(例如通过 Socket.IO 连接到 'socket.provider.com?token=12345')。正如我在问题中所述,这适用于我编写的测试纯 Ruby 程序,但我想知道如何让活动后台进程始终连接到此提供程序的 Websockets API。
    • 你能发布你的那个独立 ruby​​ 文件的代码吗?它会更容易帮助你。
    • 我已经编辑了我的答案,其中包含一些关于将数据保存在何处的见解
    猜你喜欢
    • 1970-01-01
    • 2017-08-23
    • 2018-03-28
    • 1970-01-01
    • 2011-07-22
    • 2021-10-18
    • 1970-01-01
    • 1970-01-01
    • 2019-03-15
    相关资源
    最近更新 更多