在页面之间重用websockets?
Posted
技术标签:
【中文标题】在页面之间重用websockets?【英文标题】:Reusing websockets between pages? 【发布时间】:2012-03-06 06:01:59 【问题描述】:有没有办法在一个页面上打开一个 websocket,然后在另一个页面上重用它(例如在同一个选项卡中,在用户单击链接后),而不是在每个页面加载后打开一个新的 websocket ?浏览器存储是否能够保持打开的套接字?
目标是能够为每个用户(或选项卡)保持一个 websocket,这样做会很棒,而无需以非传统方式在页面之间移动,例如使用 Javascrpt 将内容加载到 div每次用户与页面交互时。
【问题讨论】:
创建 websocket 连接时,存在某种状态,连接的双方都必须跟踪该状态以使连接存在。我认为,如果您将连接的客户端状态存储在本地存储中(请注意,必须修改 websocket 系统的客户端以允许大多数甚至所有 websocket 客户端不支持这一点据我所知),您也许可以稍后或什至在另一个页面上重新打开连接(只要服务器没有丢弃它的一半状态)。所以这一定是可能的,但如何呢?我想看看一个工作样本。 我想像服务器一样“重新创建”websocket 也必须支持它。或者更具体地说,用于在服务器上实现 websocket 支持的库。我怀疑服务器上的大多数实现会在检测到底层 TCP 连接已关闭时结束 websocket - 尽管您建议的对客户端的更改可以使其保持打开状态。 是的,一个 websocket 连接并不比作为传输创建的 tcp 连接更有效,好吧,我认为它们更聪明。 Do Shared Web Workers persist across a single page reload, link navigation的可能重复 @kanaka,不,不是。这与 websockets 有关,您的链接是关于 web 工作者的,它们是两种独立的技术。 【参考方案1】:答案是否。
即使套接字没有通过调用mySocket.close();
显式关闭,套接字也会在重新加载时被浏览器关闭。
我尝试将 Web Socket 对象存储在本地存储中并使用它再次检索数据。返回的对象是有效的,但不再存在连接。因为,当页面重新加载时,套接字会被不正常地终止。
服务器端的消息说:
[Errno 10053] An established connection was aborted by the software in your host machine
你去...
【讨论】:
我很好奇如果将 websocket(或对其的引用)放入本地存储会发生什么。感谢您尝试并解开谜团。【参考方案2】:不同的方法是让用户而不是套接字跨不同页面。我的意思是您将客户端的 ID 存储在带有 javascript 的 cookie 中,每次用户尝试从您的任何网站页面打开一个新套接字时,您都会将此 ID 发送到服务器,然后服务器就有办法知道这新连接来自同一用户。
我在最近的一个项目中做到了这一点,并且效果很好:) 根据您的计划,您可以使用他的 ID 将用户的状态保存在您的服务器上,或者将其存储在其他 cookie 中,或事件使用 flash 将其存储在共享对象中!
【讨论】:
是的,这完全有可能,并且是一个完全有效的解决方案(也是我们讨论过的一个),但是底层架构依赖于 websocket 保持打开状态来满足一些功能需求。当然,由打开和关闭套接字引起的问题可能已经得到缓解,但最终决定最好保持套接字打开并根据 URL 的位置属性动态加载内容。不确定这是更好的方法,但 c'est la vie。 @WiMantis 您在服务器端使用哪个 websocket 连接管理器?【参考方案3】:Shared Web Workers 允许您为从同一来源/站点加载的多个选项卡共享一个 WebSocket 连接。
Shared Web Workers 目前仅在 Chrome, Safari, Opera 上受支持。
【讨论】:
抱歉,我的问题不够清楚。当我说不同的页面时,我应该在同一个选项卡中指定。我已经编辑了我的问题,希望能更清楚。不过,感谢您试一试。 @Joshua: 啊,那你问的和我刚才问的一样:***.com/questions/9336774/… 也没有明确的答案,我打算在某个时候测试一下如果它适用于 Chrome/Safari。 是的,除了我希望 websockets 有一些不同之处,这意味着我可能会得到不同的答案之外,这些问题是相似的。以上是关于在页面之间重用websockets?的主要内容,如果未能解决你的问题,请参考以下文章