package com.hnedu.stat; /** * 计算在线人数,说明: * * 在访问页面放入: * com.hnedu.stat.OnlineCounter.addUser(Object object) * 一般用ip来作为object的传入值,当然,如果网站统计登陆在线人数,也可用用户名 * 来作为object传入值。 * * 调用显示在线人数 * com.hnedu.stat.OnlineCounter.getOnlineCount() * * * com.hnedu.stat.OnlineCounter.getOnline() * 返回一个List,里面以String[]形式存放传入的object值和最后访问页面时间。 * by crazyren 2003-08-05 email: c_crazyren@hotmail.com */ import java.util.List; import java.util.ArrayList; import javax.servlet.http.HttpSession; public class OnlineCounter { private static List list = new ArrayList();
private OnlineCounter() { } public static void addUser(Object object) { //得到用户当前访问时间 String nowtime = com.hnedu.util.StringUtils.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 < list.size(); i++) { temp = (String[])list.get(i); //如果从list里面取出的用户ip和str里面存放的ip相同,则更新访问时间 if(temp[0].equals(str[0])) { list.set(i,str); return; } //如果用户超过5分钟没有访问,则认为不在线 if(subTime(nowtime,temp[1]) > 300) { list.remove(i); } } //添加一个新的在线用户 list.add(str); //释放资源 str = null;temp = null; }
public static int getOnlineCount() { //返回当前在线人数 return list.size(); }
public static List getOnline() { return list; } /** 计算两个时间差,返回相差秒数 */ private static int subTime(String src,String des) { int n = 0; java.util.Calendar ca = java.util.Calendar.getInstance(); long time1 = com.hnedu.util.StringUtils.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; } }
引用的StringUtils里面的两个方法:
/** * 获得当前时间 * @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; }
|