实时判断用户是否在线的方法之一(转自CSDN上的一位朋友)。


客户端定时向服务器报告在线信息并在服务器端登记.可用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了..


 


    22003  用户id
    总经办内务用户名
    总经理办公室所在部门
    WinNT平台
    IE6浏览器
    192.168.168.120ip
    2006-11-15T12:35:00+08:00登陆时间
    2006-11-15T12:35:00+08:00刷新时间这个看好就刷新这个了这个不刷新了就代表走人了
    0分钟在线多长时间了 
 

 
    22004
    财务测试一
    财务部
    WinNT
    IE6
    192.168.168.120
    2006-11-15T12:36:00+08:00
    2006-11-15T12:38:00+08:00
    2分钟
 

 

你可能感兴趣的:(ASP.NET,AJAX,xml,object,数据库,session,function,javascript)