我正在使用socket.io构建MEAN应用程序。当页面刚刚加载时,套接字连接已建立并在用户导航到各个页面时保持实时,这要归功于应用程序的单页性质。
由于passport.socketio,我的套接字连接中提供了用户信息。
但是,当用户登录或注销时,我希望重新初始化连接,否则套接字将包含有关用户的过时数据。目前,我尝试以这种方式实现它:当用户登录/注销时,服务器通过调用socket.disconnect();
来断开此特定客户端的套接字。
在客户端,我监听disconnect
事件,并尝试重新建立连接,如下所示:
_socket.on('disconnect', function(reason) {
_socket.connect();
});
好的,现在,当用户注销或进入时,服务器断开客户端连接,此客户端连接回来,并且套接字中的用户信息是最新的。到目前为止,非常好。
但是,考虑连接断开时的不同情况:服务器重新启动。以前,它“只是工作”:当我停止服务器时,连接断开,但是当我再次启动服务器时,会自动重新建立连接。但是在我添加了_socket.connect();
电话后,它再也无法工作了:直到我在浏览器中刷新页面,连接仍然停止。
我检查过,当服务器调用disconnect();
时,reason
处理程序的disconnect
为:io server disconnect
。当服务器停止时,原因是:transport close
。
好的,那么,我已经实现了我的断开处理程序,如下所示:
_socket.on('disconnect', function(reason) {
if (reason === 'transport close'){
// don't do anything special
} else {
_socket.connect();
}
});
现在它有效。但是,所有这些似乎都是绝对的肮脏黑客。至少,给定的reason
(io server disconnect
和transport close
)似乎只是人类可读的字符串,因此它们将来可能会发生变化,这将导致我的代码变为停止工作。而且,应该有更好的方法来做到这一点;我必须错过一些必要的东西,但遗憾的是我在socket.io上找不到任何好的文档。
所以,问题是:服务器重新连接某个特定客户端的正确方法是什么?
此外,如果您对资源有任何建议可以了解socket.io,我也非常感激。