在线人数统计

方法1:

写一个单例类,每当有人登陆时将总人数加1,每当登出时总数减1。
public class AccountSingle   {
    private static AccountSingle account =new AccountSingle();
    private int total=0;  
    private AccountSingle(){}
    //取得唯一实例对象
    public static AccountSingle getInstance(){
        return account;
    }
    //登入操作,总数加1,要同步
    public synchronized void loginAction(){
        total+=1;
    }
    //登出操作,总数减1,要同步
    public   synchronized   void   logoutAction(){
        total-=1;
    }
    public int getTotal(){
        return total;
    }
}

这个类可以在登入/登出时候使用。
登入代码中加入一行:AccountSingle.getInstance().loginAction();
登出操作雷同。
这是比较简单的方法,你还可以在单例中增加一个hashtable来保存每个再线用户的信息。
你可能要问:有好多人退出系统前直接关闭页面,并不点你的登出按钮,这个问题可以通过
js来做。在页面body标签中作个声明:   οnunlοad="logout()"
在logout()函数里面执行登出的操作流程。
如果你觉得这样不安全,可以写一个监听线程来监听session。
感谢wwwer1


方法2:通过session

1、实现接口类
public class SessionListener implements HttpSessionAttributeListener{
    public void attributeAdded(HttpSessionBindingEvent event){
        if (event.getName().equals("userid")){
            try
            {
                OnlineCounter.doUser(event.getValue(),false);
            } catch (Exception e)
            {
                e.printStackTrace();
            }
        }
    }
 public void attributeRemoved(HttpSessionBindingEvent event){
        if (event.getName().equals("userid")){
            try{
                OnlineCounter.doUser(event.getValue(),true);
            } catch (Exception e){
                e.printStackTrace();
            }

          }
    }
 public void attributeReplaced(HttpSessionBindingEvent event){}
}

2、实现任务类OnlineCounter
public class OnlineCounter{
    private static List list = new ArrayList();
    private static List list1 = new ArrayList();
    private OnlineCounter() {}
    //统计当前在线会员人数
    public static void doUser(Object object,boolean bl) {
    //得到用户当前访问时间
    String nowtime = getTime("mm:ss");
    //Str数组用来存放用户的id和访问时间
    String[] str = new String[2];
    str[0] = object.toString();
    str[1] = nowtime;
    //temp数组用来临时存放从list里面取出的用户的id和访问时间
    String[] temp = new String[2];
    //循环list
    for(int i = 0;i<list.size();i++) {
        temp = (String[])list.get(i);
        //如果从list里面取出的用户ip和str里面存放的id相同,则更新访问时间
        if(bl==false && temp[0].equals(str[0])) {
            list.set(i,str);
            return;
        }
        //如果监听类中穿过来bl==true,则认为不在线
        if(bl==true && temp[0].equals(str[0])){
            list.remove(i);
        }
    }
    //添加一个新的在线用户
    if(bl==false)list.add(str);
    // 释放资源
    str = null;temp = null;
    }
    //统计网站所有在线人数
    public static void allUser(Object object) {
        //得到用户当前访问时间
        String nowtime = getTime("mm:ss");
        //Str数组用来存放用户得ip和访问时间
        String[] str = new String[2];
        str[0] = object.toString();
        str[1] = nowtime;
        //temp数组用来临时存放从list里面取出的用户ip和访问时间
        String[] temp = new String[2];
        //循环list
        for(int i = 0; i<list1.size(); i++) {
            temp = (String[])list1.get(i);
            //如果从list里面取出的用户ip和str里面存放的ip相同,则更新访问时间
            if( temp[0].equals(str[0])){
                list1.set(i,str);
                return;
            }
            //如果用户超过10分钟没有访问,则认为不在线
            if(subTime(nowtime,temp[1]) > 600){
                //System.out.print("清空list过期的值"+i);
                list1.remove(i);
            }
        }
        //添加一个新的在线用户
        list1.add(str);
        //释放资源
        str = null;temp = null;
    }
    public static int getOnlineAllCount() {
        //返回当前在线人数
        return list1.size();
    }
    public static int getOnlineCount() {
        //返回当前在线人数
        return list.size();
    }
    /*
     * public static void romovelist()
     *  {
     *  }
     */
    public static List getOnline(){
        return list;
    }
    /** 计算两个时间差,返回相差秒数 */
    public static int subTime(String src,String des){
        int n = 0;
        java.util.Calendar ca = java.util.Calendar.getInstance();
        long time1 =compareStringTime(src,des,"mm:ss");
        ca.setTimeInMillis(time1);
        n = (ca.get(java.util.Calendar.MINUTE)) * 60;
        n = n + ca.get(java.util.Calendar.SECOND);
        return n;
    }
    /**
     *
     * 获得当前时间
     *
     * @param parrten
     *            输出的时间格式
     *
     * @return 返回时间
     *
     */
    public static String getTime(String parrten){
        String timestr;
        if(parrten==null||parrten.equals("")){
            parrten="yyyyMMddHHmmss";
        }
        java.text.SimpleDateFormat sdf=new SimpleDateFormat(parrten);
        java.util.Date cday=new Date();
        timestr=sdf.format(cday);
        return timestr;
    }
    /**
     * 比较两个字符串时间的大小
     * @param t1
     *  时间1
     * @param t2
     * 时间2
     * @param parrten
     * 时间格式 :yyyy-MM-dd
     * @return 返回long =0相等,>0 t1>t2,<0 t1<t2
     */
    public static long compareStringTime(String t1,String t2,String parrten){
        SimpleDateFormat formatter = new SimpleDateFormat (parrten);
        ParsePosition pos = new ParsePosition(0);
        ParsePosition pos1 = new ParsePosition(0);
        Date dt1=formatter.parse(t1,pos);
        Date dt2=formatter.parse(t2,pos1);
        long l=dt1.getTime()-dt2.getTime();
        return l;
    }
}

3、在web。xml中配置监听类
        <!-- online user -->
        <listener>
            <listener-class>baby.com.common.SessionListener</listener-class>
        </listener>
        
4、jsp页面
        String ip="";
        if(request.getHeader("x-forwarded-for") == null){
            ip= request.getRemoteAddr();
        }else{
            ip=request.getHeader("x-forwarded-for");
        }
        OnlineCounter.allUser(ip);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值