WebSockets 在桌面浏览器中工作,但在 Chrome for Android 中失败

Posted

技术标签:

【中文标题】WebSockets 在桌面浏览器中工作,但在 Chrome for Android 中失败【英文标题】:WebSockets work in desktop browsers but fail in Chrome for Android 【发布时间】:2014-03-30 23:08:24 【问题描述】:

我有一个通过 WebSockets 连接到服务的网络应用程序。此应用在桌面版 Chrome/Firefox 中运行良好,但移动版 Chrome 出现错误:

到“ws://192.168.0.11:8080/”的 WebSocket 连接失败:一个或多个保留位打开:reserved1 = 0,reserved2 = 1,reserved3 = 0

服务器使用最新版本的libwebsockets。

此错误发生在初始连接期间,因此通过多个 2048 字节帧向客户端发送了大量的 JSON 数据。

服务器公开了几个不同的 WebSocket。其中一些也以其他方式失败:

无法将文本框架解码为 UTF-8。

...和...

无法识别的帧操作码:6

预测哪个应该失败,哪个应该成功的模式还没有显现出来。

我怀疑这里存在某种框架问题。我已经查看了 WireShark 中的消息,它们对我来说是正确的。标题似乎是正确的。

为什么这在桌面版 Chrome/Firefox 中有效,但在 android 版 Chrome 中却失败了?

【问题讨论】:

我已从 WireShark here for download 捕获。 发生这些错误是因为客户端未能正确解码帧,因此它试图从一堆位中理解,有时无法解析标头,有时位看起来像标头但是身体只是垃圾。你能强制你的应用程序一直发送 128 字节的帧然后看看吗? Chrome Android 处理部分帧的方式可能存在错误。这很有趣,请根据您的发现更新帖子。 @vtortola,请参阅我的答案以获取最新发现和解决方法。 【参考方案1】:

WireShark packet capture 显示有一些帧溢出了两个 TCP 数据包。错误消息的变化表明随机有效负载被解释为标头。我修改了我的服务器以使最大数据包大小为 1024 字节而不是 2048 字节,从而抑制了该错误。

我不知道这是否是 Android 版 Chrome 中的一个错误,或者桌面版是否容忍某些违反其移动表亲不会的规范的行为。我怀疑是前者。

编辑在我的平板电脑上,我还能够通过进入 chrome://flags 并启用实验性 WebSocket 支持来解决问题。

【讨论】:

一个帧溢出两个 TCP 数据包应该与客户端无关。我认为这是 Android Chrome 上的一个错误,无法正确读取帧边界。

以上是关于WebSockets 在桌面浏览器中工作,但在 Chrome for Android 中失败的主要内容,如果未能解决你的问题,请参考以下文章

意外的响应代码 403(但在浏览器中工作正常)

Xpath 在 Perl 中不工作,但在浏览器中工作

GET API 在浏览器中显示 KeyError,但在 Postman 中工作

Rails:上传 dropzone、S3、carrierwave,不能在 Safari 中工作,但在 Google Chrome 中工作

Rest API不通过android触发JavaScript但在浏览器中工作

如何让原生 WebSockets 在 Android 4.03 及更高版本中工作?