【问题标题】:How to debug 'Invalid frame header' Websocket issues with Rails/websocket-rails (standalone)如何使用 Rails/websocket-rails(独立)调试“无效帧头”Websocket 问题
【发布时间】:2015-01-08 22:46:57
【问题描述】:

我开始使用 websocket-rails,尝试将旧的通知轮询系统(在 Ruby 2.1/Rails 4.0 上)转换为更现代的 WS 系统。我在独立模式下使用 WebsocketRails,这是我的配置,基本上是默认的:

WebsocketRails.setup do |config|
   config.standalone = true
end

我还设置了一个在默认端口上运行的新 Redis - 这里似乎没有通信问题。

在客户端,我添加了 websocket-rails 的 JS,并在尝试打开连接并订阅频道时,使用:

@dispatcher = new WebSocketRails "localhost:3001/websocket"
@channel = @dispatcher.subscribe "notifications"

我在 Chrome 控制台中看到一个错误:

WebSocket connection to 'ws://localhost:3001/websocket' failed: Invalid frame header 

在 Firefox 中,错误有所不同,但仍然是错误:

The connection to ws://localhost:3001/websocket was interrupted while the page was loading.

从 websocket 服务器日志中,我可以看到连接已启动然后断开,但没有其他日志,即使日志级别是“调试”......我看不到其他错误并且粗略的谷歌搜索没有显示任何关于“无效帧头”的信息,所以我几乎被卡住了。

任何帮助将不胜感激!

编辑:我最终使用 NodeJS+Faye 来让事情动起来,而且它运行得非常好,我很高兴在系统中引入这个新的运动部件。根据我的具体设置,我确定问题只是临时,但有时,您只需要完成工作即可。

【问题讨论】:

  • 您使用的是什么网络服务器?我在 Thin 上使用 faye-websocket,我的情况完全相同。
  • 它在 Thin 上运行。从那以后我在安全更新后升级到 Rails 4.1 和 Ruby 2.1.5 并且没有机会再试一次,我希望圣诞节能出现奇迹。我环顾四周,找不到太多关于这个问题的信息,所以我认为这只是一个人工制品,因为元素组合非常不可能。
  • 如果您没有使用任何特殊的 Rails 功能,您可能会发现the Plezi framework 更易于使用。如果您正在使用 ActiveRecord 和 ActiveSupport,它也应该可以与它们一起使用,并且它具有简单的 Redis 集成。

标签: ruby-on-rails ruby websocket


【解决方案1】:

我认为您正在寻找以下资源:

来自问题线程:debugging websocket in google chrome

Chrome 开发者工具现在可以列出 WebSocket 帧,如果帧不是二进制的,还可以检查数据。

流程:

  1. 启动 Chrome 开发者工具
  2. 加载您的页面并启动 WebSocket 连接
  3. 单击“网络”选项卡。
  4. 从左侧列表中选择 WebSocket 连接(其状态为“101 Switching Protocols”。
  5. 单击框架子选项卡。二进制帧将显示长度和时间戳,并指示它们是否被屏蔽。显示的文本框架还包括有效负载内容。

还有 2012 年的这篇(有些旧的)博客文章:Inspecting WebSocket Traffic with Chrome Developer Tools

【讨论】:

  • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
  • @Blackwood - 谢谢。完成:)
【解决方案2】:

我认为通过网络发送的数据格式有问题。

仔细查看消息的格式。是否已正确字符串化?您的括号和括号、{}、[] 和 () 都匹配吗?您的 IDE 是否在某处插入了额外的内容?尝试使用 linter 或在线验证器验证消息。

检查发送方和接收方的消息。确保一切正确。

【讨论】:

    【解决方案3】:

    这可能不是作者原始问题的答案,但我想为这个 Invalid Frame Header 错误添加一个可能的解决方案。 根据我的小型研究,当服务器发送空响应(长度为 0 的消息)时,Websocket 协议上会生成 Invalid Frame Header。 TCP 中的 0 长度表示连接已关闭,因此空消息后的任何数据传输都失败。 This 是帮助我找到此解决方案的链接。我希望将来有人会发现这很有用并节省一些时间。

    【讨论】:

    • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
    • 这不是仅链接的答案。该答案的作者对此进行了解释,然后提到以下链接帮助他解决了这个问题。
    • 谢谢你,Akshay。我认为包含所有细节是有道理的,尽管引用的页面在 10 年内没有改变,因此未来不太可能发生。虽然我会在有时间的时候尝试添加所有细节。
    猜你喜欢
    • 2013-03-28
    • 2019-04-10
    • 2015-09-24
    • 2020-11-17
    • 2014-04-18
    • 1970-01-01
    • 1970-01-01
    • 2018-09-18
    • 2013-10-26
    相关资源
    最近更新 更多