ruby-on-rails - Ruby 服务器端 Websocket 客户端
问题描述
最近我一直在试验 ruby 和 websockets。所以我用 ActionCable 创建了一个新的 Rails 5 项目,一切似乎都可以正常工作。
但我也用Faye 的 ruby websocket 客户端创建了一个 ruby 纯脚本。与互联网上的大多数教程不同,我想尝试服务器端(作为客户端)脚本,而不是 HTML 文件中的前端 JS 脚本。
所以我尝试了它的基本用法,我成功地使握手正确执行,但我无法继续测试,因为在连接到 Rails 服务器中公开的所需频道后,我无法确定在哪里订阅。
这是我的红宝石脚本代码:
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
方法,但我仍然不确定如何与通道交互。就像从客户端订阅一样,我可以开始发送和接收消息。
解决方案
通过阅读websocket action cable client gem的自述文件,我意识到任何 websocket 都可以完成这项工作,我只需要send
根据 ActionCable 的需要在方法中发送正确的有效负载。在这种情况下:
ws.send {"command":"subscribe","identifier":"{\"channel\":\"#{channel}\",\"some_id\":\"1\"}"}.to_json
题外话:我在Rails 概述页面中找不到这个我只需要搜索ActionCable 协议
推荐阅读
- python - 根据 matplotlib 中的轴区分网格的样式
- python - 如何使用 matplotlib 创建星形标记?
- flutter - 颤动应用程序暂停时如何显示警报?
- php - 在产品页面 woocommerce 上从 mysql 表中回显自定义数据
- python - 删除超过 X 天的文件/文件夹的 Pythonic 方法
- c++ - Visual Studio 2019,没有带有“显示所有文件”的智能感知
- wpf - 切换按钮和垂直网格拆分器无法同时工作
- node.js - 使用 lambda 和无服务器在特定日期和时间仅运行一次 CRON 的 CRON 表达式是什么?
- docker - Go 1.14 模块构建命令忽略 Docker 中的供应商目录
- typescript - 带有 throwable 的 TypeScript 类型保护