我的实时聊天应用程序基于帆,SocketIO.It显示所有用户以及可用的在线用户--登录用户、发出UserConnected套接字,以及当用户断开连接时,发出UserDisconnected套接字,配置/sockets.js中的My Server端套接字代码
onConnect: function(session, socket) {
if (session.passport) {
if (session.passport.user && socket.id) {
sails.io.sockets.emit('UserConnected', {userID : session.passport.user}); }
}
}
//// By default: do nothing
//// This is a good place to broadcast a disconnect message, or any other custom socket.io logic
},
onDisconnect: function(session, socket) {
if (session.passport) {
if (session.passport.user && socket.id) {
sails.io.sockets.emit('UserDisconnected', {userID : session.passport.user});
}
}
//// By default: do nothing
//// This is a good place to broadcast a disconnect message, or any other custom socket.io logic
}问题是,当用户刷新页面时,它会显示已连接和断开连接到另一个用户,而一个主要问题是,如果一个用户登录了两个不同的浏览器,如果任何一个浏览器关闭,则显示用户与其他用户断开连接,但该用户实际上在另一个浏览器中可用。
我将如何修改/编码以解决这些问题?
提前谢谢
发布于 2014-04-16 18:40:43
@InternalFX发布了一个很好的方法;您可以在Sails v0.10.x上使用的另一种方法是:
onConnect: function(session, socket) {
// If this is a logged in user, subscribe the socket to a
// custom "loggedInCount" room
if (session.user) {
var roomName = 'loggedIn'+session.user.id;
sails.sockets.join(socket, roomName);
// If this is the first subscriber, the user is just coming online,
// so notify any subscribers about the state change.
if (sails.sockets.subscribers(roomName).length == 1) {
User.message(session.user.id, {state: 'online'}, socket);
}
}
},
onDisconnect: function(session, socket) {
if (session.user) {
var roomName = 'loggedIn'+session.user.id;
sails.sockets.leave(socket, roomName);
// If this was the last subscriber, the user is going offline,
// so notify any subscribers about the state change.
if (sails.sockets.subscribers(roomName).length == 0) {
User.message(session.user.id, {state: 'offline'}, socket);
}
}
},这使用Sails内置的pubsub体系结构来通知连接的套接字,每当特定用户联机或脱机时。它要求套接字订阅他们想知道的用户实例(使用客户端上的socket.get('/user') ),这是一个很好的实践。通过这种方式,您可以只得到有关您所关心的用户的通知(例如,如果您有一个“朋友列表”)。
发布于 2014-04-16 14:48:20
下面是我用于类似目的的方法。
var online_users = {};
module.exports.sockets = {
onConnect: function(session, socket) {
if (_.isString(session.user_id)) {
if (_.has(online_users, session.user_id)) {
online_users[session.user_id] += 1;
} else {
online_users[session.user_id] = 1;
}
}
sails.io.sockets.emit('crm/online_users', online_users);
},
onDisconnect: function(session, socket) {
if (_.isString(session.user_id)) {
if (_.has(online_users, session.user_id)) {
online_users[session.user_id] -= 1;
} else {
online_users[session.user_id] = 0;
}
}
sails.io.sockets.emit('crm/online_users', online_users);
},
}它跟踪以特定用户身份登录的浏览器数量。这样你就可以用下面的。
if (online_users[session.user_id] > 0) { console.log('USER IS LOGGED IN'); }`https://stackoverflow.com/questions/23101898
复制相似问题