首先,由于使用聊天室所有的客户都能共享信息,所以不可避免的要用到应用程序级的变量aplication 这是建立聊天室的关键,所有的谈话 可以根据 request 对象h/获取所输入的数据,并且保存在talk变量中,然后将talk 的值存到程序级变量show中<% applicatrion("show")=talk&application("show")%>接下来的是当不同用户同时执行聊天室应用程序进行操作的时候如何处理,这个问题其实与数据库中的两个用户同时写入同一个记录一样,如果两个用户同时对同一个应用程序级变量进行写操作,则一个用户所做的修改会被另一个用户的操作所覆盖,所以对application 对象数据的并发访问不采取一定的措施,则会导致两个用户试图向ASP聊天室应用程序提交数据时一个用户的提交会被另一个用户所覆盖,在被参加到会话中的所有人看到之前就消失了,为了避免这类问题的出现,我们需要使用application 对象的属性LOCK,只允许当前用户编辑和增加application对象的属性,这样当用户开始修改应用程序级变量开始,到APPLICATION对象被显示的unlock为止,APPLICATION对象的属性只能被该用户编辑如果此时有其他用户请求编辑,需要排队等待,知道应用程序被unlock 为止
application.lock
application("show")=talk&application("show")
applicatiion.unlock
了解了整个程序的核心部分,下面考虑如何保存客户信息,这里要用到一个会话级的变量,即将客户的nick保存到session中,如:
session("nick")=request.form("nick")
最后我们要考虑的如何在asp文件中处理多种事件:如客户登陆界面, 客户聊天界面 ,由于客户第一次请求.asp文件时,采用的是简单的httpget方式,但是客户在页面的表单字段中添加数据并向自身提交表单后,.ASP文件会再次被请求,不过这次数据是经过 httppost方式进行传递的.文件被请求的方式可以用良种方法来确定: 一是测试request.form集合是否包含成员,若没有,则没有,发送给表单处理的数据; 二是使用request.servervaiables("request_method")变量,如果表单是通过httpget方式被请求,则这个变量会返回"get",如果表单被提交处理则返回"post".由于后一种方法对于确定文件的请求方式更直接,所以我们使用如下代码进行判断:
ifrequest.servervariables("request_method")="get" then
由于我们设置了asp缓存,所以程序判断截面的请求方式为 get时,程序运行response.end来结束后面的所有操作,否则运行response.clear清空缓存中已经有的内容,
代码的实现:
<% @language=vbscript%>
<%response.buffer=true '设置输出缓存,用于显示不同页面
if request.servervariables("request_method")="get" then
'判断客户是以什么方式请求页面
'-------------------------------------------------------
''客户登陆截面
'---------
%>
<form method="post" action="chat.asp"><p>
<input
tyope="text"name="nick"size="20"value="nick"style="background-color:rgb(192,19,192)"><br>
<input type="submit" value="进入聊天室"name="B1"style="color:rgb(255,255,0);font-size:
9pt;background-color:rgb(0,128,128)">
<p>
<input type="hidden" name="log"size="20"value="1"><br></P>
</form>
<%'街道户程序的处理
response.end
else
'清空缓存中的内容
response.cleardimtalk
if response.form("nick")<>""then
''判断客户是否在聊天截面中
session("nick")=reqest.form("nick")
end if
%>