我开发了一个带有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);
}
});
});
答案 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);
}
});
});