根据这篇文章,https://code.google.com/p/chromium/issues/detail?id=429419 以及我为验证限制是否真实所做的一些测试 - 我知道我可以打开的WebSocket数量是有限的。
问题是我有时需要 30 多个 websocket,因为用户可能会打开 30 个选项卡。
我想知道在不同选项卡之间共享webSocket池的最佳方法是什么。以下是我想到的一些想法,我很想听听其他可能的想法:
-
在一个主窗口中分配一个 webSocket 池,作为全局可访问的元素,然后确保所有其他选项卡都是该主页的子级。然后我可以使用选项卡间通信:
window.parent...
问题是并非所有选项卡都创建为主窗口的子窗口,并且主窗口可能已关闭。
- 以某种方式"在本地存储中"分配一个 webSocket 池 - 我对本地存储不太熟悉,但我认为至少它可以以某种方式保存对当前正在管理 webSocket 的主选项卡的引用。每隔一段时间,其他选项卡就会尝试将自己设置为主选项卡。
我知道这听起来很糟糕和麻烦。但是,在访问本地存储时编写线程/进程安全代码的可能性有多大?任何例子都将不胜感激。
- 很想听听您可能有的任何其他建议。
数字 2 不起作用,因为 LocalStorage 仅限于字符串类型。
我建议看看ServiceWorkers。
单个服务工作线程可以控制多个页面。每次加载范围内的页面时,服务工作进程都会针对该页面安装并对其进行操作。
这听起来很接近你想要的。注册一个 ServiceWorker ,该 ServiceWorker 仅接受消息并将其重新广播到客户端 - 您域中的任何页面。因此,您可以有一个创建 WebSocket 连接的主页,每次推送时,它都会通过 ServiceWorker 消息传递系统广播一条消息。其他选项卡可以根据需要选择它。
或者,您可以按照相同的原理使用共享的 WebWorker 。只需将其安装为广播来自WebSocket的消息的消息传递系统即可。
这些并不完全是这些技术的预期用途......但如果它有效,它就会起作用。