【问题标题】:Socket.io keep the connection on client side when client refresh or open new page当客户端刷新或打开新页面时,Socket.io 在客户端保持连接
【发布时间】:2017-07-21 18:38:49
【问题描述】:

如果用户打开新页面或刷新页面,有什么方法可以在客户端保持相同的 socket.io 连接,也许将套接字存储在会话中,或者这是不可能的?

【问题讨论】:

  • 对不起,我遇到了问题,因为每次客户端连接到我的 socket.io 时,他都会获得一个新的 socket.id,我想确定该用户向所有打开的连接发送消息仅限客户端,所以我搜索了一下,我可以用 socket.io 房间解决我的问题
  • 没错。每个新连接都会获得一个新 ID。如果您想要持久引用来识别用户,您应该使用新连接时在socket.request.headers.cookie 中可用的cookie,如果不存在,您可以使用socket.io 中间件设置cookie。或者,您可以使用 express-session 之类的东西进行更一般的持久会话,然后也可以从 socket.io 访问它。

标签: node.js websocket socket.io


【解决方案1】:

这是不可能的。当页面更改或刷新时,您不能保持相同的 socket.io 或 webSocket 客户端连接。浏览器根本不这样做。当加载新页面或刷新当前页面时,浏览器会关闭并释放上一页面的所有资源,包括 socket.io/webSocket 连接。

因此,您的服务器必须从新加载的页面获得新的 socket.io 连接。如果您使用 cookie 或服务器端会话对象,您可以在服务器上识别连接何时来自您之前看到的客户端,然后服务器可以相应地采取行动以意识到这只是之前的客户端重新连接在新页面上。

【讨论】:

  • 为什么投反对票?如果您认为这是错误的,那么请准确发布在主机页面更改为其他页面时如何保持 socket.io 连接打开。
  • 以下情况如何:在客户端存储一个 cookie 并在服务器上存储曾经连接到应用程序的客户端对象列表。在客户端的连接事件中,检查是否在浏览器内部设置了 cookie 值以及之前连接的客户端是哪个。由于重放攻击,这对于现实世界的实现来说可能是一个问题,但取决于系统应该做什么,它仍然是一个可行的解决方案。没有?
  • @FedericoCapaldo - 您的 cookie 方案通常称为会话,并且是大多数服务器从一页到下一页跟踪客户端的方式 - 这就是 cookie 的用途。它也可以用于常规的 http 请求或传入的 webSocket 请求(所有 webSocket 连接都以 http 请求开始,因此它们在连接时获得 cookie)。如果您在 node.js 中使用 express,那么 express-session 模块会为您完成大量会话管理工作,并创建这些会话的列表并根据 cookie 自动将它们与每个传入连接相关联。
  • 投反对票,因为您的回答显然不是他们想听到的。 +1
【解决方案2】:

现在看来,WebWorker 是一种更广泛的技术,可以用来共享 websocket。

如本文所述https://crossbario.com/blog/Websocket-Persistent-Connections/ Webworker 是在“页面线程”之外运行的 Javascript,因此不会在页面更改时被删除。 请注意,它仅在同一域中运行。 您也可以在这里查看 Kanaka 的回答How to maintain a WebSockets connection between pages?(2012-2017 回答当心)

【讨论】:

    猜你喜欢
    • 2017-06-19
    • 1970-01-01
    • 1970-01-01
    • 2021-01-28
    • 2013-12-31
    • 1970-01-01
    • 2020-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多