问题标签 [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.

0 投票
0 回答
465 浏览

javascript - websocket-rails:无法连接 websocket

我一定错过了一些关于使用 websocket-rails 的重要信息,因为我不知道如何连接到 websocket 服务器。运行 websocket_rails:install 并遵循指南后,我得到以下信息:

最初,在 chrome 中检查很明显这是一个 404 错误,这意味着该地址不存在。该指南没有提到必须做任何路由,所以我不知道如何解决这个问题。

但是,如果我没有任何 websocket 控制器,那么它会变成握手超时,并且切换到 faye-websocket 0.10.0 并不能解决问题(如建议的here)。我认为可能会有某种缓存阻碍,因为任何时候我更改 websocket 控制器时,我都会收到一个未初始化的常量错误,它引用了不再存在的类的旧名称。

我在发生路由的库中找到了该文件,所以我知道我不必自己做。这里有什么问题?

0 投票
1 回答
376 浏览

websocket - websocket-rails:服务器发出 http:// 协议;客户端期望 ws:// 协议

使用 JavaScript 客户端

请注意服务器 URL 上缺少协议前缀。不要将 http:// 或 ws:// 添加到您传递给新调度程序的 URL。WebSocketRails 将为您选择最佳的可用传输并自动添加正确的前缀。

我是第一次使用 WebSocketRails。我在客户端收到此错误:

WebSocket 连接到 'ws://localhost:3000/websocket' 失败:在收到握手响应之前连接已关闭

如果我将浏览器导航到http://localhost:3000/websocket,我会收到我期望的消息。如果我导航到wsURL,我会得到ERR_DISALLOWED_URL_SCHEME. 所以看起来服务器正在生成消息,但客户端正在尝试错误的协议。

如何强制客户端使用http协议而不是ws,或强制服务器使用ws而不是广播它http

0 投票
0 回答
517 浏览

ruby-on-rails - “当前用户”的 websocket 通道

使用websocket-rails,我可以在我的控制器中使用以下代码来欺骗 websocket 发布事件:

我的目标是仅为当前用户创建一个发布订阅频道。以事件“发送新的聊天消息”为例。我只想推送这个事件接收者的频道。

我目前正在根据他们的 ID 为每个用户创建一个唯一的频道名称。我将以下代码放在我的控制器中(在别处定义了 current_user 方法:

然后在我的 Javascript 中,我使用以下内容为当前用户订阅他们自己的频道:

它的要点是使用字符串插值来为每个用户创建一个新频道,即 user12user123频道。

问题是这并不安全。任何用户都可以通过粘贴一些 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

不过,这似乎没有任何效果。

0 投票
1 回答
555 浏览

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

0 投票
0 回答
214 浏览

ruby-on-rails - Heroku上Rails应用程序中的Websocket无法正常工作

websocket-rails我使用( https://github.com/websocket-rails/websocket-rails ) gem在我现有的 RoR 应用程序中添加了一个聊天功能,我正在 Heroku 上以生产模式对其进行测试。

它在 localhost 中运行良好,但是当我将它发送到 Heroku 时,它在连接后没有从服务器接收任何进一步的消息。

连接有效:

我看到了反馈信息。

但第一个任务是在我的聊天中向服务器询问活动房间。我注意到什么都没有返回。我在服务器的操作中放置了一些反馈消息,这些消息应该执行第一个任务,但没有一个到达。我实现的反馈是一对简单的函数,它们只返回一个对象并将其打印到控制台:

Javascript

红宝石

它永远不会被触发。有任何想法吗?我必须在 Heroku 上进行特殊配置才能使其正常工作吗?

@更新

我在 AWS 上托管的实时服务器上出现同样的错误。连接已建立,但没有从服务器返回到客户端。

@update2

我写了一些代码,所以应用程序会在建立连接时写入一些文件,当它要求打开房间时,就在开始时,并且没有创建文件。甚至没有调用这些操作。

0 投票
0 回答
246 浏览

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 分钟然后超时。

您对可能发生的事情有任何想法吗?有什么我必须设置的特殊配置吗?

0 投票
0 回答
99 浏览

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 配置:

0 投票
1 回答
339 浏览

javascript - WebSockets:在私有通道中触发的多个事件是否可以乱序到达客户端

我已经阅读了多篇文章,其中强调了在顶部运行并保证订单Websockets的事实。因为,我是“Websockets”的新手,所以我有一个小问题。WebsocketsTCP Connection

我有一个简单的应用程序,我试图通过 websocket 连接发送一个大文件(1GB)。我在服务器端使用rails gem命名,在前端使用他们的客户端。websocket-railsjava script

我创建了一个私人频道,通过该频道触发事件并一个接一个地传输日期。我500 lines' at a time from通过与同一 websocket 连接的一部分相同的通道将服务器传输到客户端。数据包是否有可能以不同的顺序到达?我是否需要对re-order客户端的整个文件实施任何机制?

0 投票
0 回答
294 浏览

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,生产中没有用于加载初始化程序的特定配置。如果您需要有关此的更多信息,请告诉我

0 投票
1 回答
111 浏览

ruby-on-rails - 为什么 websocket-rails 需要作为独立服务器启动以支持基于非事件机的 Web 服务器?

来自 websocket-rails wiki,当我们使用 Phusion Passenger 或 Unicorn 时,websocket-rails 需要作为独立服务器启动,但我发现faye-rails不需要这样做。他们有什么区别?