客户端定时向服务器报告在线信息并在服务器端登记.可用xmlhttp实现
不过实现起来有点复杂...
先用 javascript 写 xmlhttp
// JScript 文件
//用xmlhttp请求RefreshTime.aspx页
function TimeOut()
{
var xmlhttp = new ActiveXObject("Msxml2.XMLHTTP.5.0");
//异步方式获取数据
xmlhttp.open("POST","RefreshTime.aspx",true);
//这里 RefreshTime.aspx 是请求的页面 你要自己建立
xmlhttp.onreadystatechange=add;
function add()
{
if(xmlhttp.readyState==4)
{
}
}
xmlhttp.send(null);
}
//定时调用 每30秒就调用 RefreshTime.aspx 页面
window.setInterval("TimeOut()",30000);
下面是 RefreshTime.aspx 页面
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
using System.Xml;
public partial class RefreshTime : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
ModifyMenu();
}
//更新xml数据库
public void ModifyMenu()
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(Server.MapPath("~/XML/Menu.xml"));
//获取Menu节点的所有子节点
XmlNodeList xmlList = xmlDoc.SelectSingleNode("NewDataSet").ChildNodes;
XmlNodeList xmlListTime = xmlDoc.GetElementsByTagName("RefreshTime");
//更新登陆用户的单个时间 Session["name"]
xmlDoc.SelectSingleNode("//Table[UserID='" + Session["UserID"].ToString() + "']").ChildNodes.Item(7).InnerText = DateTime.Now.ToString();
//这里DateTime.Now 是更新xml的用户时间拉.
xmlDoc.Save(Server.MapPath("~/XML/Menu.xml"));
}
}
因为是每 30秒就刷新一次所以最好不用sql数据库拉费资源.用XML
如果不更新的话就证明用户已经关闭IE和关机走人了.
在建立个online.aspx 页面判断 他是否走人没
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
using System.Xml;
public partial class online : System.Web.UI.Page
{
//页面初始化事件
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
DeleteMenu();
}
}
//删除xml
public void DeleteMenu()
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(Server.MapPath("~/XML/Menu.xml"));
获取Menu节点的所有子节点
XmlNodeList xmlList = xmlDoc.SelectSingleNode("NewDataSet").ChildNodes;
//获取每个纪录的活动时间 RefreshTime的节点
XmlNodeList node = xmlDoc.GetElementsByTagName("RefreshTime");
XmlNodeList nodeUserID = xmlDoc.GetElementsByTagName("UserID");
//统计RefreshTime节点的数量
int a = node.Count - 1;
for (int i = a; i >= 0; i--)
{
//如果活动时间没有刷新 并超过2分 就执行删除 node[i].InnerText是活动时间的字符串值
if (Convert.ToDateTime(node[i].InnerText.ToString()) < DateTime.Now.AddMinutes(0 - 2))
{
Response.Write(nodeUserID[i].InnerText.ToString() + "用户走人了");
//删除[xml数据库]相应的数据
xmlList[i].RemoveAll();
}
}
//保存xml文档
xmlDoc.Save(Server.MapPath("~/XML/Menu.xml"));
}
//刷新事件
protected void btn_Click(object sender, EventArgs e)
{
DeleteMenu();
}
}
你在就建立 xml数据就ok了..