强制注销用户:Socket.IO

时间:2014-03-01 11:29:06

标签: php node.js socket.io

我开发了一个带有PHP和node.js的应用程序。我的应用程序的大多数是使用PHP构建的,但是在我的webapp的实时部分我使用node.js和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);
        }
    });
});

1 个答案:

答案 0 :(得分:0)

您可以通过握手将每个用户的唯一ID传递给套接字,并在服务器上维护一个包含所有连接用户ID及其socket.id(键/值对)的全局对象。

当客户端连接时,检查对象是否具有带有用户标识的密钥,这表示用户已从其他客户端连接。

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

  • 如果为true,您可以轻松地从对象获取旧连接的socket.id并关闭此对象。然后在对象中设置新客户端的socket.id。

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

只要您同时只有一个socket.io实例(没有集群等),此方法就可以正常工作,否则您必须使用像Redis这样的中央存储来维护所有已连接用户ID的列表。

如果您需要更多详情或示例,请告知我们。

示例

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

当然,您必须将所有user_id_here替换为连接用户的ID。

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