直播中
'如果该序号为空,表明程序未初始化
If Application("chat_hh") = "" Then
'定义缓冲区数组,共 30 句发言
'每句发言占用 5 个位置:序号、姓名、发言内容、原始姓名、发言时间
Dim sd(150)
Application.Lock
'将数组赋值给 Application("chat_sd"),即:发言只保留在服务器内存中
Application("chat_sd") = sd
'定义初始序号为 0
Application("chat_hh") = 0
Application.UnLock
End If
'为避免序号过大,每当序号增大到 65535 时就将序号复位为 0
If Application("chat_hh") > 65535 Then
Application.Lock
Application("chat_hh") = 0
Application.UnLock
End If
'客户端用来记录已经显示到哪句发言的 Session("chat_hh")
'其值等于序号减去 12,即:新来的用户可以看到原有的 12 句发言
Session("chat_hh") = Application("chat_hh") - 12
⑵chatfyq.htm 中的 JavaScript 函数:write():
function write(){
//使用 document.open() 打开对话显示区,打开后不关闭,这样就可以不断向里面添加新内容
parent.f1.document.open();
//向对话显示区中写入 HTML 文件头
parent.f1.document.writeln("<html><head><title>对话区</title><meta http-equiv=Content-Type content=\"text/html; charset=gb2312\">");
//写入样式表定义
parent.f1.document.writeln("<style type=text/css>.t{color:AAAAAA;font-size:9pt;}body{font-family:\"宋体\";font-size:10.5pt;line-height:160%}A{text-decoration:none}A:Hover{text-decoration:underline}A:visited{color:blue}</style></head><\Script Language=\"JavaScript1.1\">");
//写入自动滚屏代码
//......(注意:此处省略的代码请参见完整的源程序)
parent.f1.document.writeln("StartUp();</\script>");
parent.f1.document.writeln("<body bgcolor=CDE0FC text=000000>");
parent.f1.document.writeln("<hr size=1>【欢迎光临】红蜻蜓聊天室恭候您的光临。<hr size=1>");
//将 chatt.asp 载入框架顶端的隐藏框架中,执行定时刷新功能
parent.t.location.href="chatt.asp";
}
⑶chatt.asp 定时刷新,并取得最新的发言的代码:
'将聊天室的对话内容的缓存取到 sd 数组中
sd = Application("chat_sd")
'取得最后显示的发言的序号
userhh = Session("chat_hh")
'定义 show 数组,用于存放要显示的发言内容
Dim show()
ReDim Preserve show(0)
j = 1
newuserhh = 0
'遍历缓冲区的发言内容
For i = 1 To 150 Step 5
newuserhh = sd(i)
'如果 sd(i)(每句发言的序号)大于用户端最后发言的序号且发言存在就将其存入 show 数组
If sd(i) > userhh And sd(i) > 0 Then
ReDim Preserve show(j), show(j + 1), show(j + 2), show(j + 3)
show(j) = sd(i + 1)
show(j + 1) = sd(i + 2)
show(j + 2) = sd(i + 3)
show(j + 3) = sd(i + 4)
j = j + 4
End If
Next
'输出 javascript 到客户端
Response.Write "<script Language=JavaScript>"
'输出 show 数组的内容
For i = 1 To UBound(show) Step 4
'输出 parent.f2.w(show(i),show(i+1),show(i+2),show(i+3)),调用客户端 chatfyq.htm 的 w(un,sa,tn,dt) 函数来显示发言内容
Response.Write "parent.f2.w(" & Chr(34) & show(i) & Chr(34) & "," & Chr(34) & show(i + 1) & Chr(34) & "," & Chr(34) & show(i + 2) & Chr(34) & "," & Chr(34) & show(i + 3) & Chr(34) & ");" & Chr(13) & Chr(10)
Next
'写出定时刷新的代码,使 chatt.asp 在 5000 毫秒(5秒)后进行刷新
Response.Write "setTimeout('this.location.reload()',5000);</script>"
'如果缓冲区最后一句发言的序号大于原来客户端最后一句发言的序号,就将该序号赋值给这个 Session("chat_hh"),以便下次刷新时进行新的检测,避免把相同的发言多次取出
If newuserhh > userhh Then Session("chat_hh") = newuserhh
⑷chatsay.asp 部分代码注释:
'如果发言长度超过 200 个字,就截断超出部分
If Len(says) > 200 Then says = Left(says, 200)
'将发言进行编码,使其不支持 HTML 语法
says = Server.HTMLEncode(says)
'使发言能在客户端以 JavaScript 函数进行传递
says = Replace(says, "\", "\\")
says = Replace(says, "/", "\/")
says = Replace(says, Chr(34), "\" & Chr(34))
Application.Lock
'读出缓冲区的内容到 sd 中
sd = Application("chat_sd")
'取出当前缓冲区最后一句发言的序号
hh = Application("chat_hh")
'使这个序号递增
Application("chat_hh") = hh + 1
Dim newsd(150)
j = 1
'将原缓冲区的最旧的一句发言去掉
For i = 6 To 150 Step 5
newsd(j) = sd(i)
newsd(j + 1) = sd(i + 1)
newsd(j + 2) = sd(i + 2)
newsd(j + 3) = sd(i + 3)
newsd(j + 4) = sd(i + 4)
j = j + 5
Next
'将这次发言的内容添加到最后
newsd(146) = hh + 1
newsd(147) = un
newsd(148) = says
newsd(149) = username
newsd(150) = sj
'把新的发言内容放到缓冲区中
Application("chat_sd") = newsd
sd = newsd
Application.UnLock