日期:2014-05-18  浏览次数:20371 次

如何取得用戶的在線狀態?
比如csdn那樣,在線時就顯示亮的,不在線的就顯示灰的。
這個在線狀態如何判斷?請教各位

------解决方案--------------------
可以用cookie 这个cookie 不要写到客户端 硬盘上 让这个cookie 保留在内存 然后检查这个cookie 就可以判断 是否在线
------解决方案--------------------
也可以参考这办法

1.
用Application会好些吧,Cookie在客户端存储统计实现起来比较麻烦.
简单的说:
Application["x"];
只要赋了值,如: Application["x"]; 则甲和已可以共享到此值,可以用于计数器,记录站点访问量
只要一个用户登录,则Application["x"] += 1;//加一个数,表示有个新用户刚刚登录
2.
单独建一张表,字段有:登录时间,退出时间等.用数据库进行记录.
用户上线时,在Global 文件的Session_Begin事件中可以统计

------解决方案--------------------
KeyWord: 在线 用户 列表
当用户访问网站时,会为他分配一个SessionID。令用户的IP地址和用户名称建立一个一一对应的关系。如果用户开启了新的窗口,则检查用户的IP地址或用户名是否已经在OnlineUsersHash中出现过?如果出现过,就让新的SessionID指向现有的IP地址。而当一个Session结束时,则将该SessionID从OnlineUsers_SessionIPHash中移除。判断是否还有其他SessionID指向这个IP地址,如果没有,那么从在线用户列表中移除用户名称。客户端的情况相当复杂,必须要考虑周全。下面则是新的算法的代码:

// 在Global.asax.cs 文件中
//
// 在线用户列表主键名
public const string KEY_ONLINEUSERS="OnlineUsers";
// 在线用户列表 Session 表主键名
public const string KEY_ONLINEUSERS_SESSIONIP="OnlineUsers_SessionIP";

protected void Application_Start(Object sender, EventArgs e)
{
Application.Lock();

Application[KEY_ONLINEUSERS]=null;
Application[KEY_ONLINEUSERS_SESSIONIP]=null; // 目的是将用户的SessionID和IP对应起来

Application.UnLock();
}

protected void Session_Start(Object sender, EventArgs e)
{
Application.Lock();

/* ... */

Hashtable onlineUsersHash=(Hashtable)Application[KEY_ONLINEUSERS];
Hashtable onlineUsersSessionIPHash=(Hashtable)Application[KEY_ONLINEUSERS_SESSIONIP];

if(Visitor.Current.IsGuest) // 如果用户是来宾
{
if(onlineUsersHash.ContainsKey(Request.UserHostAddress))
{
onlineUsersHash[Request.UserHostAddress]="";
}
else
{
onlineUsersHash.Add(Request.UserHostAddress, "");
}
}
else
{
if(!onlineUsersHash.ContainsKey(Request.UserHostAddress)
&& !onlineUsersHash.ContainsValue(Visitor.Current.UserName))
{
// 如果用户的 IP 地址和用户名称在列表中找不到,则将添加在线用户列表中
onlineUsersHash.Add(Request.UserHostAddress, Request.Cookies[″UserName″].Value);
}
else if(onlineUsersHash.ContainsValue(Request.Cookies[“UserName”].Value))
{
// 如果用户的 Cookie 信息能够找到,则更新(先删除再添加)在线用户的 IP 地址
//
// 说明:用户可能刚登陆不久,便因为线路故障,断线并重新拨号
// 而当用户回到网站时,用户的 Cookie 还未过期,但是 IP 地址却发生了改变
string userName=Request.Cookies[″UserName″].Value;

foreach(object key in onlineUsersHash.Keys)
{
if(((string)onlineUsersHash[key]).Equals(userName))
{
// 删除用户刚才使用过的 IP 地址
onlineUsersHash.Remove(key);
break;
}
}

// 添加在线用户
onlineUsersHash.Add(Request.UserHostAddress, Request.Cookies[″UserName″].Value);
}
else if(onlineUsersHash.ContainsKey(Request.UserHostAddress))
{
// 如果用户的 IP 地址能找到,则更新在线用户的名称
//
// 说明:用户登录后,注销并重新登陆。可能是去换个用户名
onlineUsersHash[Request.UserHostAddress]=Request.Cookies[″UserName″].Value;
}
}

// 将用户的 IP 地址和 SessionID 对应起来
if(!onlineUsersSessionIPHash.ContainsKey(Session.SessionID))
onlineUsersSessionIPHash.Add(Session.SessionID, Request.UserHostAddress);

Application.UnLock();
}

protected void Session_End(Object sender, EventArgs e)
{
Application.Lock();

i