最近做了个小论坛,需要用到统计在线的会员名单和游客的人数,经过上午的调试,总于产生了下面的代码。
总要的思路是 :在服务器端用application 保存用户名及用户最后的登陆时间。用户的每次访问都将检查现在的时间与保存在application 中的每个用户最后登陆时间之差是否大于设定的时间如过大于,则把该用户从application中剔除.
REM application("Total_Land_User") 是会员在线登陆的数目
REM application("Online_Land_User") 是在线会员的名单数组
Sub Inline_State()
Dim Forums_ As New Forums
Dim Timer As Int32 = 1
Dim temp_Land_User(), temp_User(), User_name, Land_User, User As String
Dim Num, i As Int32
Application.Lock()
If Session("User_name") <> "" Then
Land_User = Session("User_name")
If Application(Land_User & "LandUser_LastAccessTime") = Nothing Then '假如第一次登陆
If Application("Total_Land_User") = 0 Then Application.Set("Total_Land_User", 0) '假如登陆用户数为0
ReDim temp_Land_User(Application("Total_Land_User") + 1)
Num = 0
If Application("Total_Land_User") > 0 Then
For i = Application("Online_Land_User").GetLowerBound(0) To Application("Online_Land_User").GetUpperBound(0) - 1
User_name = Application("Online_Land_User")(i)
' Response.Write("清点用户是的用户是:" & User_name & "<br>")
If User_name <> Land_User Then
temp_Land_User(Num) = User_name
Num += 1
Else
Application(Land_User & "LandUser_LastAccessTime") = Nothing
End If
Next
End If
temp_Land_User(Num) = Land_User '重新把登陆用户放到数组最后
Application("Total_Land_User") = Num + 1
ReDim Preserve temp_Land_User(Application("Total_Land_User"))
Application.Set("Online_Land_User", temp_Land_User)
End If
' Response.Write("<br>总的用户数是:" & Application("Total_Land_User"))
' Response.Write("<br> Application(Online_Land_User).GetLowerBound(0):" & Application("Online_Land_User").GetLowerBound(0))
' Response.Write("<br> Application(Online_Land_User).GetUpperBound(0):" & Application("Online_Land_User").GetUpperBound(0))
' Response.Write("<br>用户列表是:")
' For i = Application("Online_Land_User").GetLowerBound(0) To Application("Online_Land_User").GetUpperBound(0) - 1
' Response.Write("<br>" & Application("Online_Land_User")(i))
' Response.Write(" 最后登陆时间为:" & Application(Application("Online_Land_User")(i) & "LandUser_LastAccessTime"))
' Next
Application(Land_User & "LandUser_LastAccessTime") = System.DateTime.Now '记录登陆时间
ReDim temp_Land_User(Application("Total_Land_User"))
Num = 0
For i = 0 To Application("Total_Land_User") - 1
User_name = Application("Online_Land_User")(i)
Dim D_date As DateTime = CType(Application(User_name & "LandUser_LastAccessTime"), DateTime)
If (System.DateTime.Now < D_date.AddMinutes(Timer)) Then
temp_Land_User(Num) = User_name
Num += 1
Else
Application(Land_User & "LandUser_LastAccessTime") = Nothing
End If
Next
If Num <> Application("Total_Land_User") Then
ReDim Preserve temp_Land_User(Num)
Application("Online_Land_User") = temp_Land_User ' 在线登陆用户数组
Application("Total_Land_User") = Num + 1 '
End If
Else
'游客的统计
User = Session.SessionID
If Application(User & "LastAccessTime") = Nothing Then '假如第一次登陆
If Application("Total_User") = 0 Then Application.Set("Total_User", 0) '假如登陆用户数为0
ReDim temp_User(Application("Total_User") + 1)
Num = 0
If Application("Total_User") > 0 Then
For i = Application("Online_User").GetLowerBound(0) To Application("Online_User").GetUpperBound(0) - 1
User_name = Application("Online_User")(i)
If User_name <> User Then
temp_User(Num) = User_name
Num += 1
Else
' Application(User & "User_LastAccessTime") = Nothing
End If
Next
End If
temp_User(Num) = User '重新把登陆用户session.sessionid放到数组最后
Application("Total_User") = Num + 1
ReDim Preserve temp_User(Application("Total_User"))
Application.Set("Online_User", temp_User)
End If
'Response.Write("<br>总的用户数是:" & Application("Total_User"))
'Response.Write("<br> Application(Online_User).GetLowerBound(0):" & Application("Online_User").GetLowerBound(0))
'Response.Write("<br> Application(Online_User).GetUpperBound(0):" & Application("Online_User").GetUpperBound(0))
'Response.Write("<br>用户列表是:")
'For i = Application("Online_User").GetLowerBound(0) To Application("Online_User").GetUpperBound(0) - 1
' Response.Write("<br>" & Application("Online_User")(i))
' Response.Write(" 最后登陆时间为:" & Application(Application("Online_User")(i) & "User_LastAccessTime"))
'Next
Application(User & "User_LastAccessTime") = System.DateTime.Now '记录登陆时间
'检测过期的
ReDim temp_User(Application("Total_User"))
Num = 0
For i = 0 To Application("Total_User") - 1
User_name = Application("Online_User")(i)
Dim D_date As DateTime = CType(Application(User_name & "User_LastAccessTime"), DateTime)
If (System.DateTime.Now < D_date.AddMinutes(Timer)) Then
temp_User(Num) = User_name
Num += 1
Else
Application(User & "User_LastAccessTime") = Nothing
End If
Next
If Num <> Application("Total_User") Then
ReDim Preserve temp_User(Num)
Application("Online_User") = temp_User '在线的游客session.sessionid数组
Application("Total_User") = Num + 1 '在线游客数量
End If
End If
Dim str_ As New System.Text.StringBuilder
Me._Total_user_num.Text = Application("Total_User") + Application("Total_Land_User")
Me._Total_notland_num.Text = Application("Total_User") & "人"
If IsArray(Application("Online_Land_User")) Then
For i = Application("Online_Land_User").GetLowerBound(0) To Application("Online_Land_User").GetUpperBound(0) - 1
User_name = Application("Online_Land_User")(i)
str_ = str_.Append(User_name & ",")
Next
Me._Total_land_num.Text = str_.ToString
End If
Application.UnLock()
End Sub
总要的思路是 :在服务器端用application 保存用户名及用户最后的登陆时间。用户的每次访问都将检查现在的时间与保存在application 中的每个用户最后登陆时间之差是否大于设定的时间如过大于,则把该用户从application中剔除.
REM application("Total_Land_User") 是会员在线登陆的数目
REM application("Online_Land_User") 是在线会员的名单数组
Sub Inline_State()
Dim Forums_ As New Forums
Dim Timer As Int32 = 1
Dim temp_Land_User(), temp_User(), User_name, Land_User, User As String
Dim Num, i As Int32
Application.Lock()
If Session("User_name") <> "" Then
Land_User = Session("User_name")
If Application(Land_User & "LandUser_LastAccessTime") = Nothing Then '假如第一次登陆
If Application("Total_Land_User") = 0 Then Application.Set("Total_Land_User", 0) '假如登陆用户数为0
ReDim temp_Land_User(Application("Total_Land_User") + 1)
Num = 0
If Application("Total_Land_User") > 0 Then
For i = Application("Online_Land_User").GetLowerBound(0) To Application("Online_Land_User").GetUpperBound(0) - 1
User_name = Application("Online_Land_User")(i)
' Response.Write("清点用户是的用户是:" & User_name & "<br>")
If User_name <> Land_User Then
temp_Land_User(Num) = User_name
Num += 1
Else
Application(Land_User & "LandUser_LastAccessTime") = Nothing
End If
Next
End If
temp_Land_User(Num) = Land_User '重新把登陆用户放到数组最后
Application("Total_Land_User") = Num + 1
ReDim Preserve temp_Land_User(Application("Total_Land_User"))
Application.Set("Online_Land_User", temp_Land_User)
End If
' Response.Write("<br>总的用户数是:" & Application("Total_Land_User"))
' Response.Write("<br> Application(Online_Land_User).GetLowerBound(0):" & Application("Online_Land_User").GetLowerBound(0))
' Response.Write("<br> Application(Online_Land_User).GetUpperBound(0):" & Application("Online_Land_User").GetUpperBound(0))
' Response.Write("<br>用户列表是:")
' For i = Application("Online_Land_User").GetLowerBound(0) To Application("Online_Land_User").GetUpperBound(0) - 1
' Response.Write("<br>" & Application("Online_Land_User")(i))
' Response.Write(" 最后登陆时间为:" & Application(Application("Online_Land_User")(i) & "LandUser_LastAccessTime"))
' Next
Application(Land_User & "LandUser_LastAccessTime") = System.DateTime.Now '记录登陆时间
ReDim temp_Land_User(Application("Total_Land_User"))
Num = 0
For i = 0 To Application("Total_Land_User") - 1
User_name = Application("Online_Land_User")(i)
Dim D_date As DateTime = CType(Application(User_name & "LandUser_LastAccessTime"), DateTime)
If (System.DateTime.Now < D_date.AddMinutes(Timer)) Then
temp_Land_User(Num) = User_name
Num += 1
Else
Application(Land_User & "LandUser_LastAccessTime") = Nothing
End If
Next
If Num <> Application("Total_Land_User") Then
ReDim Preserve temp_Land_User(Num)
Application("Online_Land_User") = temp_Land_User ' 在线登陆用户数组
Application("Total_Land_User") = Num + 1 '
End If
Else
'游客的统计
User = Session.SessionID
If Application(User & "LastAccessTime") = Nothing Then '假如第一次登陆
If Application("Total_User") = 0 Then Application.Set("Total_User", 0) '假如登陆用户数为0
ReDim temp_User(Application("Total_User") + 1)
Num = 0
If Application("Total_User") > 0 Then
For i = Application("Online_User").GetLowerBound(0) To Application("Online_User").GetUpperBound(0) - 1
User_name = Application("Online_User")(i)
If User_name <> User Then
temp_User(Num) = User_name
Num += 1
Else
' Application(User & "User_LastAccessTime") = Nothing
End If
Next
End If
temp_User(Num) = User '重新把登陆用户session.sessionid放到数组最后
Application("Total_User") = Num + 1
ReDim Preserve temp_User(Application("Total_User"))
Application.Set("Online_User", temp_User)
End If
'Response.Write("<br>总的用户数是:" & Application("Total_User"))
'Response.Write("<br> Application(Online_User).GetLowerBound(0):" & Application("Online_User").GetLowerBound(0))
'Response.Write("<br> Application(Online_User).GetUpperBound(0):" & Application("Online_User").GetUpperBound(0))
'Response.Write("<br>用户列表是:")
'For i = Application("Online_User").GetLowerBound(0) To Application("Online_User").GetUpperBound(0) - 1
' Response.Write("<br>" & Application("Online_User")(i))
' Response.Write(" 最后登陆时间为:" & Application(Application("Online_User")(i) & "User_LastAccessTime"))
'Next
Application(User & "User_LastAccessTime") = System.DateTime.Now '记录登陆时间
'检测过期的
ReDim temp_User(Application("Total_User"))
Num = 0
For i = 0 To Application("Total_User") - 1
User_name = Application("Online_User")(i)
Dim D_date As DateTime = CType(Application(User_name & "User_LastAccessTime"), DateTime)
If (System.DateTime.Now < D_date.AddMinutes(Timer)) Then
temp_User(Num) = User_name
Num += 1
Else
Application(User & "User_LastAccessTime") = Nothing
End If
Next
If Num <> Application("Total_User") Then
ReDim Preserve temp_User(Num)
Application("Online_User") = temp_User '在线的游客session.sessionid数组
Application("Total_User") = Num + 1 '在线游客数量
End If
End If
Dim str_ As New System.Text.StringBuilder
Me._Total_user_num.Text = Application("Total_User") + Application("Total_Land_User")
Me._Total_notland_num.Text = Application("Total_User") & "人"
If IsArray(Application("Online_Land_User")) Then
For i = Application("Online_Land_User").GetLowerBound(0) To Application("Online_Land_User").GetUpperBound(0) - 1
User_name = Application("Online_Land_User")(i)
str_ = str_.Append(User_name & ",")
Next
Me._Total_land_num.Text = str_.ToString
End If
Application.UnLock()
End Sub