Php 强制注销用户:Socket.IO

Php 强制注销用户:Socket.IO,php,node.js,socket.io,Php,Node.js,Socket.io,我已经用PHP和node.js开发了一个应用程序。我的大多数应用程序都是用PHP构建的,但是在我的Web应用程序的实时部分,我使用node.js和socket.io,我的问题是 如何处理登录到多客户端的用户?我计划在用户尝试从其他客户端登录时强制注销。有可能达到这种逻辑吗?如何实现?thnx io.sockets.on('connection',function(socket) { var secret = socket.manager.handshaken[socket.id].que

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

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

当客户端连接时,请检查对象是否具有具有用户id的密钥,这表示该用户已从其他客户端连接

  • 如果为false,则向对象添加用户id和套接字id

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

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

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

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

示例

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

当然,您必须用连接用户的id替换此处的所有
user\u id\u

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

你能举个例子吗?