2012-05-07 48 views
10

我遵循本指南: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客户端的列表,并有一个查看每个会话的快速会话并检查它是否与当前的用户验证相同。

回答

6

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

+0

是的,这看起来是最简单的选择。虽然我确信必须有一种方法来用全局的socket.io变量来完成它。 – Andrew

+0

我使用的是TornadIO2,在这种情况下,没有内置的方法来处理这种事情(我一行一行地阅读源代码)。但是如果在服务器上使用Node.js和socket.io,那么我就不太确定。 –

+0

是的,看起来这是做事最简单的方法。我现在将所有连接存储在一个数组中,以便我可以访问它们......为此欢呼。 – Andrew

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); 
    }); 
相关问题