【问题标题】:How to use socketio for showing Online/Offline User in Real Time Using Sails?如何使用 socketio 使用 Sails 实时显示在线/离线用户?
【发布时间】:2014-05-30 21:08:08
【问题描述】:

我的实时聊天应用程序基于SailsSocketIO。它显示所有用户以及可用的在线用户。当用户登录时,会发出 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
}

问题是当用户刷新页面时,它显示与另一个用户连接和断开连接,一个主要问题是如果一个用户登录两个不同的浏览器并且如果任何一个浏览器关闭,则显示用户与其他用户断开连接但用户实际上在另一个浏览器中可用。
我将如何修改/编码以便修复这些问题?
提前致谢

【问题讨论】:

    标签: javascript node.js socket.io chat sails.js


    【解决方案1】:

    @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') 之类的东西),这是一个很好的实践。这样您就可以只收到您关心的用户的通知(例如,如果您有一个“朋友列表”)。

    【讨论】:

    • 但是问题是在刷新页面时,它显示离线和在线。如何解决?并感谢您的帮助。
    • 还有一个问题,我可以使用sails.sockets.blast() 代替sails.io.sockets.emit()
    【解决方案2】:

    这是我用于类似目的的方法。

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

    【讨论】:

    • 这是一个很好的方法。仅供参考,如果您使用的是 Sails v0.10,则不推荐使用 sails.io 以支持 sails.sockets
    • 谢谢你,我实际上使用的是 0.10。一些重构是有序的。 :)
    猜你喜欢
    • 1970-01-01
    • 2020-05-06
    • 2016-12-23
    • 2014-05-14
    • 1970-01-01
    • 2019-06-13
    • 2011-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多