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

时间:2012-05-07 11:01:01

标签: 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);
    }
});

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

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

2 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:0)

Socket.IO上有很多代码已经过时了。

新文档(Socket.IO 1.3.6,现在)说:

"旧的io.set()和io.get()方法已弃用,仅支持向后兼容。这是一个示例授权旧式到中间件的翻译。"在"从0.9"

迁移的部分中

如果您使用新版本的Socket.IO。 您需要的代码如下:

    var sessionStore    = new MongoStore({ url: config.db });
    var cookie          = require('cookie-parser')("SECRET");
    io.use(function(socket, callback) {
        if (socket.request.headers.cookie) {
            cookie(socket.request, null, function(err) {
                sessionStore.get(socket.request.signedCookies["connect.sid"], function(err, session) {
                    if (err || !session) {
                      callback('Session error', false);
                    } else {
                      socket.request.sessionID = socket.request.signedCookies["connect.sid"];
                      console.log(socket.request.sessionID);
                      callback(null, true);
                    }
                  });
            });
        }
        else {
            return callback('No session.', false);
        }
    });
    io.on('connection', function(socket) {
        console.log(socket.request.sessionID);
    });