2014-03-01 81 views
0

我已经开发了一个应用程序使用PHP和Node.js的大多数我的应用程序使用PHP但是在我的webapp我使用Node.js和受socket.io我的实时部分建问题是......强制注销用户:Socket.IO

如何处理在多个客户端中登录的用户?我打算在他/她尝试从另一个客户端登录时强制注销用户。是否有可能实现这个逻辑,以及如何?日Thnx

io.sockets.on('connection',function(socket) { 
    var secret = socket.manager.handshaken[socket.id].query.secret; 
    clients[secret] = socket; 
    console.log('Client Connected'); 
    // Notification 
    app.on("notification",function(data){ 
     socket = clients[data.recipient]; 
     if(socket != undefined){ 
      console.log('worked'); 
      socket.emit('notify',data); 
     } 
    }); 
}); 

回答

0

你可以通过每个用户一个唯一的ID,通过握手插座和维护包含与他们socket.id(键/值对),所有连接的用户ID的服务器上的全局对象。

当客户端连接你检查对象具有用户ID,这表明用户已经从其他客户端连接的关键。

  • 如果为false,则将用户标识和套接字ID添加到该对象。

  • 如果属实,你可以很容易地从该对象的旧连接的socket.id并关闭这一个。然后,在对象中设置新客户端的socket.id。

当客户端断开连接时,您从对象中删除具有用户标识的密钥。

这种方法,只要你只有一个socket.io同时实例(没有群集等)的作品,否则,你必须使用像Redis的中央存储器,以维护所有连接的用户ID的列表。

如果您需要更多的细节或例子,请让我知道。

我没有测试过下面的代码,但是这应该是你的最简单的解决方案。

当然你有连接的用户的ID,以取代所有user_id_here

var user_connected = {}; 

io.sockets.on('connection',function(socket) { 

// Check if user is already connected 
if(user_connected.hasOwnProperty(user_id_here)) { 
    // If true, disconnect previous connection 
    user_connected['user_id_here'].disconnect(); 
} 

// Add current socket to object 
user_connected['user_id_here'] = socket; 

var secret = socket.manager.handshaken[socket.id].query.secret; 
clients[secret] = socket; 
console.log('Client Connected'); 
// Notification 
app.on("notification",function(data){ 
    socket = clients[data.recipient]; 
    if(socket != undefined){ 
     console.log('worked'); 
     socket.emit('notify',data); 
    } 
}); 
}); 
+0

你可以举一些例子吗? – NEWBIE

+0

请参阅更新,并告诉我这是否适合您。 – 1nsane