彩票走势图

如何使用java统计在线人数

转帖|其它|编辑:郝浩|2010-12-21 17:16:56.000|阅读 563 次

概述:本文将介绍如何使用java统计在线人数,希望对大家有帮助。

# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>

  对于登录信息时使用session存储的,所以我这里是通过实现HttpSessionAttributeListener这个接口完成的。

  1、实现接口类,在web.xml文件中配置监听类,从而可以使该类完成其工作。

  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相等,&gt;0 t1&gt;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>

  最后就是在访问页面调用类中的alluser方法来实现统计在线人数就可以了

  String ip="";

  if (request.getHeader("x-forwarded-for") == null)

  {

  ip= request.getRemoteAddr();

  }

  else

  {

  ip=request.getHeader("x-forwarded-for&quot;);

  }

  OnlineCounter.allUser(ip);

  这样就完成了 在线统计功能。

 

 


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@cahobeh.cn

文章转载自:网络转载

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP