强制注销用户:Socket.IO



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

如果你需要更多的细节或例子,请告诉我。

示例

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

当然,您必须将所有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);
}
});
});

最新更新