Ruby服务器端Websocket客户端

时间:2020-02-07 20:56:38

标签: ruby-on-rails ruby websocket actioncable

最近我一直在尝试使用ruby和websockets。因此,我使用ActionCable创建了一个新的Rails 5项目,似乎一切正常。

但是我也用Faye's ruby websocket client创建了一个红宝石纯脚本。与Internet上的大多数教程不同,我想尝试服务器端(作为客户端)脚本,而不是HTML文件中的前端JS脚本。

因此,我尝试了它的基本用法,并成功使握手正确执行,但由于连接到Rails服务器中所需的通道后无法确定订阅位置,因此无法继续测试。

这是我的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方法,但是我仍然不确定如何与通道进行交互。就像从客户端订阅一样,我可以开始发送和接收消息。

1 个答案:

答案 0 :(得分:1)

通过阅读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中找不到这个