如何检测来自同一用户的多个socket.io连接

And*_*rew 12 node.js express socket.io

我已按照本指南:http://www.danielbaulig.de/socket-ioexpress/将express.js链接到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);
    }
});
Run Code Online (Sandbox Code Playgroud)

如何检查即将接受的客户端是否具有先前的连接,并且它仍处于打开状态(因此我们需要断开旧的连接).

快递会话中有一个"用户名" - 所以我们可以获取会话对象并获取用户名,我只是无法弄清楚如何查看所有socket.io客户端的列表并查看快递每个会话的会话,并检查它是否与当前进行身份验证的用户相同.

Ton*_*leh 7

在我的应用程序中,我明确地管理了socket.io会话.在服务器端,无论何时建立新连接,我都会执行以下操作:socketio_session[user_id].push(session).这使我可以访问为特定用户连接的所有会话.在您的情况下,您可能不需要存储每个用户的会话列表,但只存储最新会话并onconnect在存储新会话之前强制断开现有会话(如果有).