如何使用Rails/websocket-rails(独立版)调试“无效帧头”Websocket问题

13

我正在开始使用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服务器日志中,我可以看到已经建立了一条连接,但是该连接随后被断开,尽管日志级别为“debug”,但没有其他日志记录...我没有发现其他错误,并且简单的谷歌搜索也没有找到任何关于“invalid frame header”的信息,所以我卡住了。

如果有任何帮助,将不胜感激!

编辑:最终我使用NodeJS+Faye使事情前进了,并且它一直工作得很好,我很高兴在系统中引入这个新的移动部分。 我确信问题只是基于我的特定设置而出现的暂时性问题,但有时候,你只需要完成任务。


你在使用什么Web服务器?我正在使用thin上的faye-websocket,而且我正处于完全相同的情况。 - itdoesntwork
它正在运行Thin。此后,我已经升级到Rails 4.1和Ruby 2.1.5以进行安全更新,但还没有机会再次尝试,我希望有一个圣诞奇迹。我已经四处寻找并没有找到关于这个问题的太多信息,因此我认为这只是由于非常不可能的元素组合而产生的一种现象。 - Enders
如果您没有使用任何特殊的Rails功能,那么您可能会发现Plezi框架更容易使用。如果您正在使用ActiveRecord和ActiveSupport,它也应该可以工作,并且具有易于集成Redis的功能。 - Myst
3个回答

7

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

来自问题线程:在谷歌浏览器中调试WebSocket

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

过程:

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

还有这篇(有点旧的)2012年的博客文章:使用Chrome开发者工具检查WebSocket流量


2
虽然这个链接可能回答了问题,但最好在此处包含答案的基本部分并提供参考链接。如果链接页面更改,仅链接的答案可能会失效。- 来自审查 - Blackwood
@Blackwood - 谢谢。已完成 :) - Myst

0

这可能不是作者原问题的答案,但是我想增加一个解决无效帧头错误的可能解决方案。 经过我的一些研究,在Websocket协议中,当服务器发送空响应(长度为0的消息)时,会产生Invalid Frame Header错误。 TCP中的0长度表示连接已关闭,因此在空消息之后进行任何数据传输都将失败。 就是帮助我找到这个解决方案的链接。我希望未来有人能从中受益,并节省一些时间。


1
这不是一个仅包含链接的答案。回答者先解释了它,然后提到以下链接是帮助他弄清楚的内容。 - Akshay Sehgal
谢谢,Akshay。我认为包括所有细节是有道理的,尽管引用的页面在过去的10年里没有改变,因此未来发生的可能性很小。不过,我会尽可能在有时间的时候添加所有细节。 - klacek139

0

我认为数据在传输过程中的格式出现了问题。

仔细检查消息的格式。它是否已经被正确地字符串化?你的括号和圆括号,{},[]和()是否匹配?你的IDE是否插入了额外的内容?尝试使用linter或在线验证器验证消息。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接