Socket.io:第一个客户端在第二个连接上断开连接

时间:2013-10-12 22:26:25

标签: javascript node.js socket.io

我正在创建一个socket.io应用程序。当我在firefox上创建与套接字的连接时,它建立得很好。当我使用chrome来初始化与套接字的另一个连接时,第一个客户端断开连接,然后两个客户端再次重新连接(使用相同的socket.id)

这是我一直在使用的代码:

app.post('/auth', function(req, res){   // routes.auth(hash, db, io, pseudoArray, connections, Session));
    var username = req.body.username,
        password = req.body.password;
    if (username != "" && password != ""){
        authenticate(username, password, db, hash, function(err, user){
            if (user) {
                // Regenerate session when signing in
                // to prevent fixation 
                console.log('user authenticated');
                req.session.regenerate(function(){
                    req.session.user = user.name;
                    req.session.success = 'Authenticated as ' + user.name
                    + ' click to <a href="/logout">logout</a>. '
                    + ' You may now access <a href="/restricted">/restricted</a>.'; 

                    var Session = connect.middleware.session.Session;
                    io.sockets.on('connection', function (socket) {
                        var hs = socket.handshake;
                        console.log('A socket with sessionID ' + hs.sessionID + ' connected!');

                        socket.set('pseudo', req.session.user, function(){
                            pseudoArray.push(req.session.user);
                            socket.emit('pseudoStatus', req.session.user);
                            console.log("user " + req.session.user + " connected");
                        });

                        socket.on('pseudoOk', function(data){
                        //  connections[data] = socket; 
                            connections[data] = socket.id; // connected user with its socket.id
                            connectedUsers[socket.id] = socket;

                            console.log('----CONNECTIONS----');
                            console.log(connections);
                            console.log('++ USERS ++ ');
                            console.log(connectedUsers);
                            console.log('----END CONNECTIONS----');
                        });

                        socket.on('disconnect', function () {
                            console.log('A socket with sessionID ' + hs.sessionID + ' disconnected!');

                            // clear the socket interval to stop refreshing the session
                            // clearInterval(intervalID);
                        });
                    });

                    res.cookie('rememberme', '1', { maxAge: 900000, httpOnly: true });
                    res.redirect('home');
                });
            } else {
                console.log('auth failed');
                req.session.error = 'Authentication failed, please check your '
                    + ' username and password.'
                    + ' (use "tj" and "foobar")';
                res.redirect('login');
            }
        }); 
    } else {
        res.redirect('connect');
    }
});

任何线索?

主要问题是:单台计算机(localhost)上的套接字连接是否可以在同一台计算机上的两个不同浏览器中运行?我在想的是,因为我在一台机器上使用两个浏览器,所以我为这两个浏览器获得了相同的套接字ID。是这样的吗?

1 个答案:

答案 0 :(得分:1)

对于connection的每个POST请求,您正在socket.io /auth事件上创建一个事件侦听器。这将导致未定义的行为和可能的内存泄漏。 Express和socket.io是在同一服务器应用程序中运行的两个独立子系统。因此,他们不应该这样混合。

'正常'的Express / socket.io设置如下所示:

// your Express routes
app.post('/auth', function(req, res) { ... });
...

// socket.io setup (completely separate)
io.sockets.on('connection', function(socket) {
  ...
});

如果要在Express和socket.io之间共享会话对象:这不是一件容易的事。就像我之前说的那样,两个系统应该被认为是彼此分开的。但是,有一些聪明的人that got it to work。我不知道博客文章是如何更新的,而且它需要对Express和socket.io有深入的了解。