网站统计在线人数–websocket 与 session

http 是无状态的,无法感知用户在线状态

登录增加在线人数、推出减少在线人数,这是非常不准确的做法(比如用户直接关闭浏览器,而不是点击退出系统,此时就无法正确的统计)

第一个办法:session 的个数

比如监听 session 创建,每创建一个session则增加一个在线人数,每销毁一个session就减少一个在线人数。在java里实现很简单。

package com.demo.listener;


import javax.servlet.ServletContext;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class PeopleListener implements HttpSessionListener {
    /**
     * 监听session创建
     * @param se
     */
    @Override
    public void sessionCreated(HttpSessionEvent se) {
        ServletContext context = se.getSession().getServletContext();
        Integer num = (Integer) context.getAttribute("online_num");
        if(num == null)
            num = 0;
        ++num;
        context.setAttribute("online_num",num);
        System.out.println("新增一位用户...");
    }

    /**
     * 监听session销毁
     * @param se
     */
    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        ServletContext context = se.getSession().getServletContext();
        Integer num = (Integer) context.getAttribute("online_num");
        if(num == null)
            num = 0;
        else
            --num;
        context.setAttribute("online_num",num);
        System.out.println("减少一位用户...");
    }
}

对于 php 等没有 application 的语言,是无法获取session的个数的,此时可以通过把 session 存入数据库实现,比如在 session 创建时,记录(session_id())到数据库中,并记录添加的时间,每次点击都记录最新活动时间,并把5分钟外的session全部删掉,那么当前表中的记录数,就是当前在线人数。(尽管不那么精确,但是很接近了)

websocket方案

WebSocket技术实现了什么

在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

在 WebSocket API 中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。

则每次创建 websocket,则增加一个在线人数,websocket断开则减少一个在线人数。

服务器可以检测到 websocket 的活动,并进行广播,当前在线记录数考虑记录在 application 中,php等语言可以记录在数据库或redis。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注