2017-07-21 48 views
3

有办法让客户端上的相同socket.io连接,如果用户打开一个新页面或刷新页面,可能存储在会话插座或者这是不可能的?Socket.io保持对客户端连接时,客户端刷新或打开新的一页

+0

抱歉,我有一个问题,导致客户端每次连接到我的socket.io他得到一个新socket.id,我想,以确定用户发送消息仅从该客户所有打开的连接时间,所以我搜索一下,我可以用socket.io房间解决我的问题 – John

+1

这是正确的。每个新连接都会获得一个新ID。如果你想要一个持久的引用来标识一个用户,你应该在新连接时使用一个在'socket.request.headers.cookie'中可用的cookie,并且你可以使用socket.io中间件来设置一个cookie不存在。或者,您可以使用诸如express-session之类的更常规的持久会话,然后再从socket.io访问它。 – jfriend00

回答

3

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

所以,你的服务器有期待新加载的页面新socket.io连接。如果您使用cookie或服务器端会话对象,则可以在服务器上识别何时从先前看到的客户端连接到服务器,然后服务器可以相应地采取行动,以便意识到这只是以前的客户端重新连接在新的页面上。

+0

为什么downvote?如果你认为这是错误的,那么请将主机页面更改为其他页面时,确保如何保持socket.io连接处于打开状态。 – jfriend00

+0

以下内容如何:在客户端上存储cookie并在服务器上存储曾连接到应用程序的客户端对象列表。在客户端的连接事件中,检查cookie值是否在浏览器中设置,以及之前连接的客户端是哪个。由于重放攻击,这对于真实世界的实现可能是一个问题,但取决于系统应该做什么,它仍然是一个可行的解决方案。没有? – FedericoCapaldo

+1

@FedericoCapaldo - 您的Cookie方案通常称为会话,并且是大多数服务器如何从一个页面跟踪客户端 - 这就是Cookie的用途。它可用于常规的http请求或传入的webSocket请求(所有webSocket连接都以http请求开始,因此它们在连接时获取cookie)。如果您使用express与node.js,那么会有快速会话模块为您执行大量的会话管理工作,并创建这些会话的列表并自动将它们与每个基于Cookie的传入连接关联。 – jfriend00

相关问题