【问题标题】:Socket.io check for inactivity apart from heartbeat from client除了来自客户端的心跳之外,Socket.io 检查不活动
【发布时间】:2013-01-03 10:54:36
【问题描述】:

我有一个 PHP 应用程序,它具有使用 nodejssocket.io 的聊天功能。 我现在需要做的是,如果用户休眠超过 15 分钟,则将用户注销。

会话在 PHP 应用程序和Nodejs 服务器之间共享。所以nodejs 服务器知道用户上次登录的时间或他/她上次活动的时间。

我正在考虑向 socket.io 客户端发送logoff 命令,如果我能区分心跳和来自客户端的消息,那将非常容易。

由于 PHP 应用程序只知道用户在页面重新加载或导航时的活动,因此用户在休眠时仍可能在聊天,而 PHP 应用程序将不知道用户是否在聊天。所以从会话中检查用户的最后一个活动是行不通的。

所以这里的主要问题是,我能否识别一个仅发送心跳超过 15 分钟(无发射)的客户端?

【问题讨论】:

  • 根据聊天活动更新会话,如果 15 分钟内没有任何活动,则在下次心跳时注销不是正确的操作吗?

标签: node.js socket.io


【解决方案1】:

根据聊天活动注销的最简单方法是设置一个简单的计时器,每次用户聊天时都会重置该计时器。像这样的:

io.sockets.on('connection', function(socket) {
    // ...
    var logoffTimer;
    socket.on('chat', function() {
        // clear the timer on activity
        // should also update activity timestamp in session
        clearTimeout(logoffTimer);
        // set a timer that will log off the user after 15 minutes
        logoffTimer = setTimeout(function(){
            // add log off logic here
            // you can also check session activity here
            // and perhaps emit a logoff event to the client as mentioned
            socket.emit("logoff", { reason: "Logged off due to inactivity" });
        }, 60 * 15);
    });
});

【讨论】:

  • 需要稍微修改一下以使其适用于所有客户端。在上面的代码中,任何用户的活动都会重置logoffTimer。这应该特定于连接套接字。
  • @Broncha 嗯。你确定吗?每个连接的客户端都会触发connection 事件,logoffTimer 是在该范围内定义的。
  • @MarcusEkwall 这太完美了!差不多 3 年后,这正是我所需要的,谢谢!
猜你喜欢
  • 2012-09-30
  • 1970-01-01
  • 2018-11-10
  • 2014-04-12
  • 1970-01-01
  • 2016-06-16
  • 2012-06-23
  • 1970-01-01
  • 2016-03-04
相关资源
最近更新 更多