使用 Socket.io 的 Websocket 连接出现无法解释的延迟,距离页面加载仅 10 秒

GPi*_*kiy 6 javascript websocket node.js socket.io

问题:我有一个安全摄像头,它只能远程显示当前帧,需要我每隔一段时间轮询此帧以获得类似视频的流。为了同步向所有客户端显示的帧,我使用 Socket.io 每 500 毫秒将帧作为 base64 字符串从服务器流式传输。我遇到的问题是,在我的台式计算机上,一切正常,但在较慢的设备(手机和平板电脑)上,提要会停在一帧上并等待一段时间(大约 40-60 秒)然后一堆帧冲进去试图赶上。从那时起,馈送结束了 10 秒的延迟。

采取的步骤/信息/背景:

  • 这几乎在页面加载 10 秒后发生。
  • 套接字成功地向我发送了一些图像,直到延迟开始,所以它甚至不是第一次运行此代码。
  • 我当时没有做任何具体的事情,所以它不是一个阻塞功能。
  • 图像被压缩,因此 base64 字符串大小不会超过 Socket.io 的消息大小限制。
  • 我尝试将套接字代码移动到网络工作者,以便它位于单独的线程上,但延迟仍然存在。
  • Socket.io 的调试信息在那一刻没有显示任何特定的信息,所有 websocket 活动只是停止,websocket 报告 a ping timeout,它重新连接成功,然后一切正常。
  • 我尝试根据我读到的其他问题在 Socket.io 中设置一些选项,例如transports: [ 'websocket' ], allowUpgrades: falsepingInterval: 500, pingTimeout: 60000, upgradeTimeout: 30000, timeout: 30000,但这些都没有帮助。
  • 所有与 websockets 无关的 JavaScript 代码在延迟期间继续运行,没有问题。
  • 我将此行添加socket.sendBuffer = [];到我的套接字连接事件中,以查看延迟后的图像冲击是否在此缓冲区中以某种方式出现,但它仍然发生。
  • 当时网络没有任何问题,因为我可以看到fetch在此延迟期间有几个请求工作正常。

问题:当时 websocket 没有发生任何事情时,是什么导致了延迟?为什么在页面加载后正好 10 秒?如果它的系统资源/处理能力相关,为什么给它自己的线程没有帮助?当 Socket.io 的文档说在断开连接期间没有将任何发射保存在缓冲区中时,延迟之后是如何出现大量图像的?

编辑:这似乎是 Chrome 的问题。Firefox 和 Edge 没有这个问题。Edge 有其自身的问题,但这是意料之中的。