如何使用socketio实时显示在线/离线用户使用帆船
How to use socketio for showing Online/Offline User in Real Time Using Sails?
我的实时聊天应用程序基于Sails和SocketIO。它显示所有用户以及可用的在线用户。当用户登录时,会发出UserConnected套接字,当用户断开连接时,会发送UserDisconnected套接字,config/sockets.js中我的服务器端socketio代码是
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
}
问题是,当用户刷新页面时,它会显示与另一个用户的连接和断开连接,一个主要问题是,如果一个用户登录了两个不同的浏览器,并且任何一个浏览器关闭,则会显示用户与其他用户的连接断开,但该用户实际上在另一个浏览器中可用
我该如何修改/code以便解决这些问题
提前感谢
@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')
的东西),这是一个很好的实践。通过这种方式,您只能收到您关心的用户的通知(例如,如果您有"朋友列表")。
以下是我用于类似目的的方法。
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'); }`
相关文章:
- 使用acess代币登录Facebook,并通过网络应用程序离线发布
- 回调函数在python代码中离线
- web浏览器中的离线应用程序存储数据并在之后上传
- OSM-离线查询我的IONIC/CORDOVA项目
- 访问离线jquery应用程序中的本地文件
- 独立离线的html5网络应用程序
- 如果没有互联网连接,Android WebView离线消息
- 如何离线存储数据库,在线时共享到服务器
- qoxdoo中的离线存储是否与所有浏览器和本地文件系统兼容
- Chrome离线不会使用cache.manifest
- 使用jquery将html文件加载到html中,用于离线/本地项目
- 在 Meteor.loginWithPassword 之后,旧用户不会离线(meteor-user-status 包)
- 当用户离线时使用角度 js 返回缓存响应
- 在twitch tv javascript中显示离线用户
- 为用户提供离线HTML5 web应用程序的访问权限
- node . js,套接字.Io:检查用户是否在线或离线
- 是否有可能在javascript中离线服务用户创建的内容
- Twitch流状态显示在线.当用户离线时
- 在线和离线用户实时使用strophe.js
- 如何使用socketio实时显示在线/离线用户使用帆船