在线人数统计

方法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、付费专栏及课程。

余额充值