淺談思路嚴謹的用戶在線狀態控制【附部分C#參考代碼】

作者: 吉日嘎拉 不僅權限管理  來源: 博客園  發布時間: 2010-10-14 07:16  閱讀: 1398 次  推薦: 0   原文鏈接   [收藏]  

  我們經常會遇到:

  1:客戶購買了5個用戶的許可,10個用戶的許可,軟件需要限制用戶的并發數量,我知道就是Oracle的并發用戶達到20個以上,那費用是非常昂貴的。

  2:一個用戶只能登錄一次或者是一個賬號在同一時間只能登錄一個,若已經是登錄了就不讓再登錄了,需要能控制用戶的并發登錄問題。

  3:有的系統也需要能實現在線用戶列表、用戶的登錄狀態等,特別是即時消息功能的內部管理系統等。

  先把自己的思路整理圖貼出來如下:

  C/S的部分參考代碼如下:這里為了實現定時獲取消息的平滑,利用了線程的方式,這樣不影響用戶的操作,是多線程實現定時獲取消息的。

 
/// <summary>
/// 消息檢測的線程
/// </summary>
private Thread MessageThread = null;

this.MessageThread = new Thread(new ThreadStart(this.MessageCheck));
MessageThread.Start();


private void MessageCheck()
{

while (!this.ExitApplication)
{

if (this.FormLoaded && (!this.Busyness))
{

if (this.Tag == null)
{

// 獲得新消息
// this.bwGetNewMessage.RunWorkerAsync();
this.GetNewMessage();
this.Tag = true;
}

else
{
// 若已經是最小化、或者被隱藏起來了,就不用獲取在線狀態,可以提高效率
if ((this.WindowState == FormWindowState.Minimized) || !(this.Visible))
{

// 閱讀消息狀態
// this.MessageChek();
}
// 獲取在線狀態列表
// this.bwGetOnLineState.RunWorkerAsync();
this.GetOnLineState();
this.Tag = null;
}
}
Thread.Sleep(
1000);
}
}

  B/S部分的參考代碼如下:

  UserOnLine.aspx 頁面,專門接收,我還活著的用戶的報道,統一呼叫這個頁面,表示自己還活著,在線上。用了javascript 的 setTimeout 功能,定時在服務器上用 ajax 方式進行簽到,這樣可以正確處理B/S系統的在線情況:

 
<script language="javascript">
function ReloadSession() {

XmlPost(
"Modules/Common/User/UserOnLine.aspx");
// 每100秒鐘刷新一次
// alert("ReloadSession");
setTimeout("ReloadSession()", 1000 * 100);
}

ReloadSession();

</script>

  以上只是一個非高科技的,用最傳統的方法,最說得通的方式,正確解決在線用戶的狀態,其中解決了B/S,C/S通用的在線方式問題,突然斷電等異常情況下的事務處理在線判斷,服務器上,還可以部署在線狀態跟蹤器等,100%完全正確做到在線狀態,還是有點兒小困難,特別是B/S的項目,目前的能力,只能做到近似效果,當然根據實際需要,也可以修改向服務器報道我活著的頻率,例如5秒報道一次,那就更接近真實在線情況了,當然在線客戶數量很少時,1秒一次也無所謂的。

0
0
 
標簽:.net
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()