【发布时间】:2018-01-28 02:02:23
【问题描述】:
我有一个简单的代码在我的 sql 数据库中为用户设置离线。
服务器
io.on('connection', function (socket) {
ApiHelper.setUserOnline(socket.token);
socket.on('disconnect', function () {
ApiHelper.setUserOffline(socket.token);
});
}
可以这么说,
用户连接到套接字而不是失去网络连接然后重新连接。
我得到了这个日志。
- 用户已连接(他在线)
- 网络丢失。
- 网络丢失但服务器尚未收到断开连接事件,因此用户仍然在线
- 用户重新连接到网络然后套接字。用户仍然在线。
- 服务器和用户收到的先前断开连接事件在数据库中设置为脱机。 但是等待用户刚刚重新连接,所以实际上用户必须在线。
由于断开连接事件触发较晚,我们看到用户在数据库中处于离线状态。
我怎样才能解决这个问题?
【问题讨论】:
-
每个会话是否有唯一的 ID 或类似的东西?
-
@tobifasc 是的,令牌是每个用户的唯一 ID。
-
我的意思不是针对每个用户,而是针对用户创建的每个会话。您可以将会话 ID 添加到已连接和已断开连接的日志中。因此,当用户使用旧会话 ID 断开连接但他已经获得了新会话 ID 时,他不会与新会话 ID 断开连接。你明白了吗?
-
如果用户打开了多个选项卡,此代码将永远无法工作。我建议维护给定用户拥有多少连接的计数,并且仅在计数变为零时才设置为脱机。然后,您不必关心事件的顺序,如果用户碰巧在您的网站上使用多个选项卡或计算机,您的代码将正常工作。
-
@jfriend00,我得到了它并编写了它运行良好的代码。