统计论坛在线人数

wang7535067 2012-03-14 04:25:47
jsp做的论坛,怎样统计论坛的在线人数
...全文
317 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
dryZeng 2012-03-19
  • 打赏
  • 举报
回复
这个问题,论坛里面多的是。搜一下就行啦。
成一粒 2012-03-19
  • 打赏
  • 举报
回复
application中存放的数据是所有在线用户都可以访问和修改的。所以可以在application中设置计数器。
当然也会出现线程安全的问题。所以要用synchronized关键字控制。

wang7535067 2012-03-19
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 helei123a 的回复:]
application
[/Quote]
这个方法是不是要结合那个HashMap用的,如果用户登录成功,就把放入map然后存到application里。
获取在线人数是直接获取map的size。
wang7535067 2012-03-19
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 wangbaoyin 的回复:]
2楼给出答案了,,
[/Quote]
这个方法用过了,只能增加,不能减少。
wang7535067 2012-03-19
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 zy205817 的回复:]
google下不就是有很多吗?楼主是需要思路吗?还是代码?
[/Quote]
参考代码。
helei123a 2012-03-19
  • 打赏
  • 举报
回复
application
五哥 2012-03-19
  • 打赏
  • 举报
回复
下面为我的测试例子,首先建个web工程,例子中程序包括:OnLineUser.java ,login.jsp ,logout.jsp,onLineUser.jsp,closePage.jsp五个文件


  OnLineUser.java 内容如下:

  

package org.cai.servlet ;

import java.util.* ;
import javax.servlet.http.* ;
import javax.servlet.* ;

public class OnLineUser implements HttpSessionBindingListener{
public OnLineUser(){
}
private Vector users = new Vector() ;
public int getCount(){
users.trimToSize() ;
return users.capacity() ;
}

public boolean existUser(String userName){
users.trimToSize() ;
boolean existUser = false ;
for(int i = 0; i < users.capacity(); i++){
if (userName.equals((String)users.get(i))){
existUser = true ;
break ;
}
}
return existUser ;
}

public boolean deleteUser(String userName){
users.trimToSize() ;
if (existUser(userName)){
int currUserIndex = -1 ;
for (int i= 0; i< users.capacity(); i++){
if (userName.equals((String)users.get(i))){
currUserIndex = i ;
break ;
}
}
if (currUserIndex != -1 ){
users.remove(currUserIndex) ;
users.trimToSize() ;
return true ;
}
}
return false ;
}

public Vector getOnLineUser(){
return users ;
}

public void valueBound(HttpSessionBindingEvent e){
users.trimToSize() ;
if (!existUser(e.getName())){
users.add(e.getName()) ;
System.out.print(e.getName() + "\t登入到系统\t" + (new Date())) ;
System.out.println("在线用户数:" + getCount()) ;
}else{
System.out.println(e.getName() + " 系统中已经存在.") ;
}
}

public void valueUnbound(HttpSessionBindingEvent e){
users.trimToSize() ;
String userName = e.getName() ;
deleteUser(userName) ;
System.out.print(userName + "\t退出系统\t" + (new Date())) ;
System.out.println("在线用户数为:" + getCount()) ;
}
}




  login.jsp 的内容如下 :


  <%@ page language="java" contentType="text/html;charset=gb2312"%>
<html>
<head>
<title>JSP在线人数</title>
</head>
<body>
<form name="login" method="post" action="onLineUser.jsp">
用户名称:<input type="text" name="username" />
<input type="submit" name="submit" value="登陆" />
</form>
</body>
</html>


logout.jsp的内容如下 :


  <%@ page language="java" contentType="text/html;charset=gb2312"%>
<%@ page import="org.cai.servlet.OnLineUser,java.util.*" %>

<jsp:useBean id="onlineuser" class="org.cai.servlet.OnLineUser" scope="application" />

<html>
<head>
<title>JSP在线人数</title>
</head>
<body>
<center>
<p></h1>登陆成功,欢迎您访问!</h1></p>
</center>
<%
System.out.println("----------------------- ") ;
String username = request.getParameter("username");
if (username != null && onlineuser.deleteUser(username)) {
out.println(username+"已经退出系统!");
session.removeAttribute(username) ;
if (onlineuser.getCount() >0) {
out.println("<script>window.location=\"onLineUser.jsp\";</script>") ;
}else{
out.println("<script>window.location=\"login.jsp\";</script>") ;
}
}else {
out.println(username+"没有登陆到系统!");
out.println("<script>window.location=\"login.jsp\";</script>") ;
}
%>
<center>
<p>webjx.com制作</p>
<p> </p>
<p><a href="logout.jsp">退出系统</a></p>
</center>
</body>
</html>


  onLineUser.jsp的内容如下:




  <%@ page language="java" contentType="text/html;charset=gb2312" %>
<%@ page import="org.cai.servlet.OnLineUser ,java.util.*" %>
<jsp:useBean id="onlineuser" class="org.cai.servlet.OnLineUser" scope="application" />
<html>
<head>
<title>JSP在线人数</title>
</head>
<body>
<center>
<p><h3>登陆成功,欢迎访问cai.com</h3></p>

<%
session = request.getSession(false) ;
String username = request.getParameter("username") ;
if (username != null){
if (onlineuser.existUser(username)){
out.println("用户<font color=red>"+username+"</font> 已经登陆!") ;
}else{
session.setMaxInactiveInterval(50);//Session的有效时长,以秒为单位
session.setAttribute(username,onlineuser) ;
out.println("欢迎新用户:<font color=red>" + username + "</font> 登陆到系统!") ;
}
}
out.println("<br>当前在线用户人数:<font color=red>"+onlineuser.getCount()+ "</font></br>") ;
Vector vt = onlineuser.getOnLineUser() ;
Enumeration e = vt.elements() ;
out.println("在线用户列表:") ;
out.println("<table border=1>") ;
out.println("<center>") ;
out.println("<tr><td>用户名</td><td>操作</td></tr>") ;
while(e.hasMoreElements()){
String uname = (String)e.nextElement() ;
out.println("<tr><td>") ;
out.println("   " + uname + "   ") ;
out.println("</td>") ;
out.println("<td>") ;
out.println("<a href='logout.jsp?username=" + uname + "'>    退    出   </a>" ) ;
out.println("</td>") ;
out.println("</tr>") ;
}
out.println("</center>") ;
out.println("</table>");
%>
<p>caiDM制作</p>
<p> </p>

<%
out.print("<p> <a href='login.jsp'>登陆</a></p>" ) ;
out.print("<p> <a href='logout.jsp?username=" + username + "'>退出系统</a></p>" ) ;
%>
</center>
</body>
</html>


  
  closePage.jsp的内容如下:


  

<%@ page contentType="text/html;charset=gb2312"%>
<%@page import="javax.servlet.http.*"%>
<jsp:useBean id="onlineuser" class="org.lab24.servlet.OnLineUser"
scope="application" />

<%
//下面的方式会把所的用户赶下线,这个可以是由于没指定一个用户名给valueUnbound方法,所以当使用invalidate方法时,会将所有的用户都赶下线了
//HttpSession session2 = request.getSession(false);//变量名要是最为session会抛异常的。
//HttpSession session = request.getSession();
//session2.invalidate();

String username = request.getParameter("username");
if (username != null && onlineuser.deleteUser(username)) {
out.println(username + "已经退出系统!");
session.removeAttribute(username);
out.println("<script>window.location=\"login.jsp\";</script>");
} else {
out.println(username + "已经退出系统!");
out.println("<script>window.location=\"login.jsp\";</script>");
}
%>
web.xml




<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee ;
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

<listener>
<listener-class>org.lab24.servlet.OnLineUser</listener-class>
</listener>

<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>


URL:http://user.qzone.qq.com/55979071/infocenter#!app=2
heroleader 2012-03-19
  • 打赏
  • 举报
回复
2楼给出答案了,,
码无边 2012-03-19
  • 打赏
  • 举报
回复
google下不就是有很多吗?楼主是需要思路吗?还是代码?
默雨茗 2012-03-17
  • 打赏
  • 举报
回复
session监听器2楼很详细
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20120313/09/5f1403a5-26ea-43f3-865b-cd9ca0fdd383.html
看我回复的
成一粒 2012-03-17
  • 打赏
  • 举报
回复
在application中声明一变量。当一个用户登录时就加一。并且要保证线程安全用synchronized关键字控制
wang7535067 2012-03-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 andy188 的回复:]

首先,编写一个简单的计数器,代码如下:

package gongfei.cmc.articles.onlinecounter;
public class OnlineCounter {
private static long online = 0;
public static long getOnline() {
return onl……
[/Quote]
这个方法用过,但是用户进来时是增加,但用户关闭浏览器了没有减少。
安特矮油 2012-03-14
  • 打赏
  • 举报
回复
如果不是要求特别精确的话可以通过统计session来判断。因为浏览器访问的话你无法解决客户端突然断电之类的一些特殊情况。所以不可能有太精确的统计
andy188 2012-03-14
  • 打赏
  • 举报
回复
首先,编写一个简单的计数器,代码如下:

package gongfei.cmc.articles.onlinecounter;
public class OnlineCounter {
private static long online = 0;
public static long getOnline() {
return online;
}
public static void raise(){
online++;
}
public static void reduce(){
online--;
}
}

  然后,编写HttpSessionListener实现类,在这个实现类的sessionCreated方法中调用OnlineCounter的raise方法,在sessionDestroyed方法中调用OnlineCounter的reduce方法,代码如下:

package gongfei.cmc.articles.onlinecounter;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class OnlineCounterListener implements HttpSessionListener {
public void sessionCreated(HttpSessionEvent hse) {
OnlineCounter.raise();
}
public void sessionDestroyed(HttpSessionEvent hse) {
OnlineCounter.reduce();
}
}

  再然后,把这个HttpSessionListener实现类注册到网站应用中,也就是在网站应用的web.xml中加入如下内容:

<web-app>
……
<listener>
<listener-class>
gongfei.cmc.articles.example.OnlineCounterListener
</listener-class>
</listener>
……
</web-app>

  OK,在线人数统计功能已经实现,只要在JSP页面中加入下面这样的脚本就能显示但前在线人数了:

<%@ page language="java" pageEncoding="GB2312" %>
<%@ page import="gongfei.cmc.articles.onlinecounter.OnlineCounter" %>
<html>
<head><title>On Line Counert</title></head>
<body bgcolor="#FFFFFF">
On line:<%=OnlineCounter.getOnline()%>
</body>
</html>
star95hmz 2012-03-14
  • 打赏
  • 举报
回复
如果有新的用户登录进来。也就是新开辟了session,那么在application中就做+1的操作,session销毁-1
这个比较简单

81,122

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧