如何利用 websocket 统计在线时长?

需要做一个功能,统计用户某天在线玩游戏的时长,打算根据用户建立和断开 websocket 的时候记录这个时间点,然后去统计。

websocket 是前端去连接的,连接成功是可以知道的,可以上报给后端接口,那么断开 websocket 如何去捕获呢?有可能用户会直接关闭浏览器,前端这个时候无法去捕获吧。

另外,假设记录表设计如下:

id  userid  current_time      day       type
1     111       22222     2017-06-20      1
2     222       23333     2017-06-20      2
3     333       33333     2017-06-20      1
4     444       38999     2017-06-20      2

如何统计时长?

阅读 10.2k
2 个回答
  1. 从websocket判断连接断开,断开时获取这个连接的创建时间,然后写入数据库。

  2. 如果websocket前面有nginx等反代,可以通过nginx的日志统计。当然你得想办法把用户信息和日志对接起来。

这里是用node.js写的一个websocket服务器(修改自ws的npmjs文档

const WebSocket = require('ws');

const wss = new WebSocket.Server({port: 8080});

function heartbeat() {
    this.isAlive = true;
}

wss.on('connection', function connection(ws) {
    ws.isAlive = true;
    ws.on('ping', heartbeat);
});

const interval = setInterval(function ping() {
    wss.clients.forEach(function each(ws) {
        if(ws.isAlive === false) {
            // 处理终端中断,此处写中断断开逻辑
            return ws.terminate();
        }

        ws.isAlive = false;
        ws.ping('', false, true);
    });
}, 30000);

这个Websocket服务器处理的机制是,每30秒发出一次心跳包,如果连接到这个服务器的客户端的isAlive标记为false,则表示该终端断开,此处也可添加断开日志逻辑。
至于终端连接则比较简单,直接监听websocket的open事件即可。

这两个操作记录都是在服务器端完成,不需要前端去判断页面是否关闭。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏