Ale*_*Qiu 10 javascript websocket service-worker shared-worker
如何在多个浏览器选项卡之间共享单个 WebSocket 连接?
我知道有多个建议 SharedWorker 的问题/帖子。然而,由于 SharedWorker 的采用率很低(根据Can I use在撰写本文时的数据,全球范围内只有 35%),这并不是一个可行的解决方案,更不用说它已经在 Safari 中被删除了。
我已经使用 SerivceWorker 实现了一个工作版本,它具有一些 SharedWorker 的功能,可以跨选项卡共享单个连接。不幸的是,在测试过程中,我意识到 ServiceWorker 可以被浏览器杀死/停止,特别是当开发工具未打开时。我还知道一些解决方法可以防止这种行为,例如定期 ping ServiceWorker。我想请问是否有适当的方法来处理这个问题。
不幸的是,这并不是一项简单的任务。但由于许多浏览器将连接数量限制为相同数量,origin这是我多次遇到的问题。
假设您被迫共享连接并且其他选项不可行,则有以下几种可能性:
2 和 3 的技巧是,您将只有一个选项卡保持 WS 连接并通过通信通道与其他选项卡共享其使用情况。最棘手的部分是当“主”选项卡关闭时;您将需要选择另一个选项卡来打开连接。
请注意,2 和 3 在“主”选项卡更改期间都会受到缓冲延迟和额外延迟的影响。SharedWorker 也有其缺陷。因此,这些解决方案都不适合高速实时应用程序(如游戏)。如果您需要一个实时解决方案或只是一个更容易实施的解决方案,请选择以下选项:
如果您只需要解决连接限制,那么这是一个完美的作弊方法:创建一个指向*.wss.example.com同一服务器的域,然后通过在每个选项卡上随机生成域来欺骗浏览器(例如3af893.wss.example.com,,,a6a589.wss.example.com... )。通过这种模式,您可以建立无限的连接。请记住设置可靠的CORS策略,否则这种模式会让您面临大量恶意流量。
尽管实施了许多上述解决方案,但我最终在生产中使用了这个解决方案,因为事实证明它更加稳定和可靠。该解也适用于Server Side Events( SSE)。
这里讨论了许多提到的选项跨浏览器选项卡共享 websocket?正如艾斯坎达尔所说
| 归档时间: |
|
| 查看次数: |
2750 次 |
| 最近记录: |