淺談思路嚴謹的用戶在線狀態控制【附部分C#參考代碼】
我們經常會遇到:
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);
}
}
/// 消息檢測的線程
/// </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>
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秒一次也無所謂的。
全站熱搜