在网上查了很多资料,有说到用iframe定时刷新来实现,我试着做了一个,感觉还不错。
1、首先需要在页面中添加<iframe style="display:none" id="ifr" src="User/Refresh.aspx"></iframe>使其隐藏,
Refresh.aspx负责往数据库中添加新用户并每3秒刷新一次来改变登入用户的最后时间。
在Refresh.aspx页面中添加
<script type="text/javascript">
setInterval('location.reload()',3000);
</script>
使页面每3秒刷新一次。
在Refresh.aspx.cs page_load函数中
string s = "-1";//-1为游客
if (this.Session["onlineid"] == null)//当用户刚登录时
{
string str = "insert into Map_online(userid) values("+s+"); select IDENT_CURRENT('Map_online')";
this.Session["onlineid"] = ExecuteSql(str);//执行sql语句并返回id
}
else//当刷新页面时
{
string strSql = "update Map_online set lastdate='" + DateTime.Now + "' where id=" + this.Session["onlineid"];//每3秒改一次最后登入时间
ExecuteSql(strSql);
}
2、登入的用户最后登入时间是不断的在刷新并与当前时间区别不大,当用户离开页面后最后登入时间停止刷新
所以用另一页面删除离开页面的用户。
同样在页面中添加<iframe style="display:none" src="User/RefData.aspx"></iframe>使其隐藏,
在RefData.aspx中添加
<script type="text/javascript">
setInterval('location.reload()',120000);
</script>
每两分钟清理一次数据库
在RefData.aspx.cs中
protected void Page_Load(object sender, EventArgs e)
{
string strSql = "select * from Map_online";
SqlDataReader sdr = ExecuteDataTable(strSql);
while (sdr.Read())
{
int i = DateTime.Now.CompareTo(Convert.ToDateTime(sdr["lastdate"].ToString()).AddSeconds(10));
if (i > 0)//数据未能及时更新
{
strSql = "delete from Map_online where id=" + sdr["id"].ToString();
ExecuteSql(strSql);
}
}
}