我遵循本指南:http://www.danielbaulig.de/socket-ioexpress/将express.js链接到socket.io,并且它工作得非常出色。如何检测来自同一用户的多个socket.io连接
我有用户登录一个页面(express.js POST请求,设置一个会话对象),当他们已经通过身份验证它指示他们到一个新的页面,其中socket.io加载并在服务器上socket.io可以抓住从快递中设置的会话。这样一切正常。
现在我有使用socket.io的页面上的用户,并刷新页面时 - 有时socket.io连接仍然存在(即它不会断开连接)。我试图做的是改变io.set('authorization')
函数以确保当用户连接时 - 它将断开仍然对该客户端开放的所有现有的socket.io实例。
这里是如何看的那一刻:
//socket.io connect to express
var parseCookie = require('connect').utils.parseCookie;
io.set('authorization', function (data, accept) {
if (data.headers.cookie)
{
data.cookie = parseCookie(data.headers.cookie);
data.sessionID = data.cookie['express.sid'];
// (literally) get the session data from the session store
sessionStore.get(data.sessionID, function (err, session)
{
if (err || !session)
{
// if we cannot grab a session, turn down the connection
//note: a session is created when the user logs in
accept('Error', false);
}
else
{
//TODO something here before we accept the connection
//??
// save the session data
data.session = session;
//accept the connection
accept(null, true);
}
});
}
else
{
return accept('No cookie transmitted.', false);
}
});
我如何检查,如果这是将要接受的客户端有以前的连接,它仍然是开放的(因此我们需要断开那个旧的)。
快速会话中有一个“用户名” - 所以我们可以获得会话对象并获得用户名,我只是无法弄清楚如何通过所有socket.io客户端的列表,并有一个查看每个会话的快速会话并检查它是否与当前的用户验证相同。
是的,这看起来是最简单的选择。虽然我确信必须有一种方法来用全局的socket.io变量来完成它。 – Andrew
我使用的是TornadIO2,在这种情况下,没有内置的方法来处理这种事情(我一行一行地阅读源代码)。但是如果在服务器上使用Node.js和socket.io,那么我就不太确定。 –
是的,看起来这是做事最简单的方法。我现在将所有连接存储在一个数组中,以便我可以访问它们......为此欢呼。 – Andrew