ruby-on-rails - Ruby 服务器端 Websocket 客户端

标签 ruby-on-rails ruby websocket actioncable

最近我一直在尝试 ruby​​ 和 websockets。所以我用 ActionCable 创建了一个新的 Rails 5 项目,一切似乎都运行良好。

而且我还使用 Faye's ruby websocket client 创建了一个 ruby​​ 纯脚本。与互联网上的大多数教程不同,我想尝试服务器端(作为客户端)脚本,而不是 HTML 文件中的前端 JS 脚本。

所以我尝试了它的基本用法,并成功地使握手正确执行,但我无法继续测试,因为在连接到 Rails 服务器中公开的所需 channel 后,我无法确定在哪里订阅。

这是我的 ruby​​ 脚本代码:

require 'faye/websocket'
require 'eventmachine'

EM.run {
  ws = Faye::WebSocket::Client.new('ws://localhost:3001/cable',nil,{
    headers: {'Origin' => 'ws://localhost:3001/cable'}
  })

  ws.on :open do |event|
    p [:open]
    ws.send({data: 'hello'})
  end

  ws.on :message do |event|
    p [:message, event.data]
  end

  ws.on :close do |event|
    p [:close, event.code, event.reason]
    ws = nil
  end

  ws.on :error do |event|
    p [:close, event.code, event.reason]
    ws = nil
  end

  ws.send({data: 'yoyoyooy'}) # This gets sent to nowhere..
  # I was hoping into subscribing a channel and callbacks for that channel, something like:
  # ws.subscribe('my-channel',receive_message_callback,error_callback)
}

在可操作方面,我的连接类确实触发了 connect 方法,但我仍然不确定如何与 channel 交互。就像从客户端订阅一样,我可以开始发送和接收消息。

最佳答案

通过阅读websocket action cable client gem的自述文件我意识到任何 websocket 都可以完成这项工作,我只需要根据 ActionCable 的需要在 send 方法中发送正确的有效负载。在这种情况下:

ws.send {"command":"subscribe","identifier":"{\"channel\":\"#{channel}\",\"some_id\":\"1\"}"}.to_json

题外话:我在 rails overview page 中找不到这个我只需要搜索 ActionCable Protocol

关于ruby-on-rails - Ruby 服务器端 Websocket 客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60120963/

相关文章:

node.js - 无法让 SSL 与 NodeJS 一起工作

ruby-on-rails - has_and_belongs_to_many 连接表的 Rails 迁移

ruby - 如何终止 transmission-cli

ruby-on-rails - Rails 4 自定义ActiveAdmin 批处理 Action 集合表单标签

html - 如何使 Nokogiri 透明地返回未触及/编码的 Html 实体?

从 Ruby 调用 ANSI C 方法

python-3.x - 如何使用带有 asyncio 的高速公路连接到 binance websocket 服务

c# - MVC3 网格中的部分结果

android - 从移动应用程序使用 AWS(特别是 S3)的首选方式是什么?

ruby-on-rails - 如何在 Ruby on Rails 中拥有插件架构?