在线人数统计

深藏阁楼爱情的钟 2022-05-28 08:20 358阅读 0赞

方法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 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中配置监听类


baby.com.common.SessionListener

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 条评论,358人围观)

还没有评论,来说两句吧...

相关阅读

    相关 监听器:统计在线人数

            接着,我来写一个监听器的案例来巩固学习监听器的知识,便于日后的查阅和复习。大概分为以下几个步骤: 1.编写统计人数的Servlet,实现特定的监听器接口 2

    相关 使用 Redis 统计在线用户人数

    在构建应用的时候, 我们经常需要对用户的一举一动进行记录, 而其中一个比较重要的操作, 就是对在线的用户进行记录。 本文将介绍四种使用 Redis 对在线用户进行记录的方