问题标签 [websocket-rails]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
javascript - websocket-rails:无法连接 websocket
我一定错过了一些关于使用 websocket-rails 的重要信息,因为我不知道如何连接到 websocket 服务器。运行 websocket_rails:install 并遵循指南后,我得到以下信息:
最初,在 chrome 中检查很明显这是一个 404 错误,这意味着该地址不存在。该指南没有提到必须做任何路由,所以我不知道如何解决这个问题。
但是,如果我没有任何 websocket 控制器,那么它会变成握手超时,并且切换到 faye-websocket 0.10.0 并不能解决问题(如建议的here)。我认为可能会有某种缓存阻碍,因为任何时候我更改 websocket 控制器时,我都会收到一个未初始化的常量错误,它引用了不再存在的类的旧名称。
我在发生路由的库中找到了该文件,所以我知道我不必自己做。这里有什么问题?
websocket - websocket-rails:服务器发出 http:// 协议;客户端期望 ws:// 协议
请注意服务器 URL 上缺少协议前缀。不要将 http:// 或 ws:// 添加到您传递给新调度程序的 URL。WebSocketRails 将为您选择最佳的可用传输并自动添加正确的前缀。
我是第一次使用 WebSocketRails。我在客户端收到此错误:
WebSocket 连接到 'ws://localhost:3000/websocket' 失败:在收到握手响应之前连接已关闭
如果我将浏览器导航到http://localhost:3000/websocket
,我会收到我期望的消息。如果我导航到ws
URL,我会得到ERR_DISALLOWED_URL_SCHEME
. 所以看起来服务器正在生成消息,但客户端正在尝试错误的协议。
如何强制客户端使用http
协议而不是ws
,或强制服务器使用ws
而不是广播它http
?
ruby-on-rails - “当前用户”的 websocket 通道
使用websocket-rails,我可以在我的控制器中使用以下代码来欺骗 websocket 发布事件:
我的目标是仅为当前用户创建一个发布订阅频道。以事件“发送新的聊天消息”为例。我只想推送这个事件接收者的频道。
我目前正在根据他们的 ID 为每个用户创建一个唯一的频道名称。我将以下代码放在我的控制器中(在别处定义了 current_user 方法:
然后在我的 Javascript 中,我使用以下内容为当前用户订阅他们自己的频道:
它的要点是使用字符串插值来为每个用户创建一个新频道,即
user12
和user123
频道。
问题是这并不安全。任何用户都可以通过粘贴一些 Javascript 来访问任何其他人的私人频道。例如,如果用户 #1 想要访问用户 #2 的新闻提要,他们只需键入dispatcher.subscribe('user2')
.
你会如何解决这个问题?是否有另一个内置了此功能的 pub-sub 库?
查看有关该主题的 WebsocketRails wiki 条目,我尝试将以下代码添加到 config/initializers/websockets.rb
以下是 app/controllers/connections_controller.rb
然后在别处,我打电话WebsocketRails[:"user#{@current_user.id}"].make_private
不过,这似乎没有任何效果。
ruby-on-rails - Websocket Rails 在握手期间得到 404
我安装了“websocket-rails”gem,在完成默认配置后,我刚刚创建了一个 JS 调度程序,但在 chrome 控制台上出现 404 错误。
这是我的 JS:
这是我收到的信息:
WebSocket 连接到“ws://localhost:3000/websocket”失败:WebSocket 握手期间出错:意外响应代码:404
其他一切都按照第一步指南的建议
事件.rb
控制器/chat_server_controller.rb
ruby-on-rails - Heroku上Rails应用程序中的Websocket无法正常工作
websocket-rails
我使用( https://github.com/websocket-rails/websocket-rails ) gem在我现有的 RoR 应用程序中添加了一个聊天功能,我正在 Heroku 上以生产模式对其进行测试。
它在 localhost 中运行良好,但是当我将它发送到 Heroku 时,它在连接后没有从服务器接收任何进一步的消息。
连接有效:
我看到了反馈信息。
但第一个任务是在我的聊天中向服务器询问活动房间。我注意到什么都没有返回。我在服务器的操作中放置了一些反馈消息,这些消息应该执行第一个任务,但没有一个到达。我实现的反馈是一对简单的函数,它们只返回一个对象并将其打印到控制台:
Javascript
红宝石
它永远不会被触发。有任何想法吗?我必须在 Heroku 上进行特殊配置才能使其正常工作吗?
@更新
我在 AWS 上托管的实时服务器上出现同样的错误。连接已建立,但没有从服务器返回到客户端。
@update2
我写了一些代码,所以应用程序会在建立连接时写入一些文件,当它要求打开房间时,就在开始时,并且没有创建文件。甚至没有调用这些操作。
ruby-on-rails - Websocket-Rails gem 作为独立超时运行,试图连接到实时服务器上的 Thin
我正在设置这个包含聊天模块的应用程序,并且在 localhost 上一切正常。
现在我正在尝试将服务器作为独立服务连接,但连接状态dispatcher
始终是“正在连接”,直到它最终超时并显示以下消息:
WebSocket 连接到“ws://myserver:3001/websocket”失败:连接建立错误:net::ERR_CONNECTION_TIMED_OUT
宝石文件
Javascript
初始化器
我正在按照此处的说明启动服务: https ://github.com/websocket-rails/websocket-rails/issues/302
如果我在调度程序中更改 URL/端口,我会得到不同的错误。但应该工作的那个需要 2 或 3 分钟然后超时。
您对可能发生的事情有任何想法吗?有什么我必须设置的特殊配置吗?
ruby-on-rails - Websocket-rails 和 redis-rb 不会在故障转移时恢复 Pub/Sub 通道
我在同步集群配置中使用 websocket-rails:
- 2 个 Rails 实例(前端)
- 2个Redis实例,一主一从(后端)
- 所有节点上的 4 个 Sentinel 实例
Websocket-rails 通过向 Sentinel 查询当前 master 成功地通过 redis-rb 创建了一个连接。
还成功创建了一个 Redis Pub / Sub Channel 以在两个前端之间同步 websocket 事件:
故障转移时会出现问题。停止主 redis 节点后,哨兵成功处理了故障转移。几秒钟后,他们投票选出了一位新主人。
即使是前端客户端也可以在故障转移后成功连接到新的 redis 主服务器。我可以成功地从 rails 触发 Websocket Rails 通道,例如:
但是,与其他节点的同步失败。这是因为 websocket redis Pub/Sub 通道只存在于旧的 master 上,不存在于新的 master 上。
当然,当 rails 服务器重新启动时,websocket-rails 会重新创建通道。但这在我们的高可用环境中不是一个选项。
我想知道这是否已在类似的环境中解决。我一直在检查 websocket-rails 和 redis-rb 的文档,但我没有发现任何有用的东西。在我看来,redis 的行为是正确的,因为渠道无法复制。
我认为客户端应该在故障转移后重新创建通道,但我什至不确定这是否应该由 websocket-rails 或底层 redis-rb(甚至底层驱动程序)实现?
使用的版本:
- 雷迪斯:3.2
- websocket-rails:0.7.0
- redis-rb:3.3.0
任何帮助表示赞赏。
附件 1:websocket rails 配置:
javascript - WebSockets:在私有通道中触发的多个事件是否可以乱序到达客户端
我已经阅读了多篇文章,其中强调了在顶部运行并保证订单Websockets
的事实。因为,我是“Websockets”的新手,所以我有一个小问题。Websockets
TCP Connection
我有一个简单的应用程序,我试图通过 websocket 连接发送一个大文件(1GB)。我在服务器端使用rails gem
命名,在前端使用他们的客户端。websocket-rails
java script
我创建了一个私人频道,通过该频道触发事件并一个接一个地传输日期。我500 lines' at a time from
通过与同一 websocket 连接的一部分相同的通道将服务器传输到客户端。数据包是否有可能以不同的顺序到达?我是否需要对re-order
客户端的整个文件实施任何机制?
ruby-on-rails - Rails 初始化程序文件未在生产环境中加载
我已经修补了 websocket-rails gem 以在我的开发设置中工作。
我在 config/initializers 下创建了一个文件 websocket_patch.rb 并从websocket-rails-0.7.0\lib\rails\app\controllers\websocket_rails\delegation_controller.rb复制了代码
已添加命名空间Namespace1以引用该文件并与我的项目结构相匹配。
所以我必须覆盖delegation_controller.rb 中的默认访问。
它在开发环境中正常工作,但在生产中中断。它返回 gem 文件以供参考,而不是在 config/initializers 下加载文件
Rails 版本:3.2.22.4,Ruby 版本:2.2,生产中没有用于加载初始化程序的特定配置。如果您需要有关此的更多信息,请告诉我
ruby-on-rails - 为什么 websocket-rails 需要作为独立服务器启动以支持基于非事件机的 Web 服务器?
来自 websocket-rails wiki,当我们使用 Phusion Passenger 或 Unicorn 时,websocket-rails 需要作为独立服务器启动,但我发现faye-rails不需要这样做。他们有什么区别?