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

我遵循本指南: http ://www.danielbaulig.de/socket-ioexpress/将express.js链接到socket.io,它工作出色。

我有用户在一个页面上login(express.js POST请求,设置一个会话对象),当他们已经通过身份validation指示他们到一个新的页面,其中socket.io加载和服务器上的socket.io可以抓住会议从明确expression。 这样一切正常。

现在我有使用socket.io页面上的用户,并刷新页面 – 有时socket.io连接仍然存在(即它不断开)。 我试图做的是改变io.set('authorization')function,以确保当用户连接 – 它将断开所有仍然对该客户端开放的现有的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客户端的列表,并看看快递会话,并检查它是否与当前的用户authentication相同。

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

在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); });