ajax+asp+mssql无刷新聊天室

斯洛文尼亚旅游 2009-09-07 11:44:41
加精
此为asp版本的无刷新聊天程序源代码,支持html web编辑器。

下面只列出asp版本的代码,js类库及说明请看下面asp.net版本的,php版本也在下面。


asp.net版本
ajax+asp.net+mssql无刷新聊天室

php版本
ajax+php+mssql无刷新聊天室


不过有个小问题,就是firefox下如果使用快捷键ctrl+enter发送信息时,如果不延时调用发送函数,会弹出ff的下载对话框,奇怪。

谁能解决这个问题,100分归他,其他100分当作散分。

if(e.ctrlKey&&e.keyCode==13){
e.preventDefault();
e.stopPropagation();
setTimeout("Showbo.Chat.send()",50);//在ff中马上使用alert提示时尽然弹出下载工具,奇怪.
return false;}
},false);



为了加快速度,使用了存储过程。


要使用不同的动态页面,只需要更改lib.js文件中RequstUrl变量的值即可。


完整示例下载

效果如下









内容长度限制,所以就不贴出所有的代码了,要看全部代码请下载示例或者查看下面这篇文章
ajax+asp.net+mssql无刷新聊天室



op.asp
<%@ language="vbscript" codepage="936" %>
<%
Const adCmdStoredProc=4
Const adInteger = 3
Const adVarChar = 200
Const adParamInput=1
Const adParamOutput =2
Const adExecuteNoRecords=128

Response.Charset = "gb2312"
Response.ContentType = "text/html"
Dim json,op,cn

function isNL(v)
isNL=trim(v&"")=""
end function

function js(v)
js=replace(v,"'","\'")
end Function

Function opendb
Set cn=server.CreateObject("ADODB.Connection")
cn.open "driver={sql server};server=.;database=chatdb;uid=sa;pwd=;"'注意修改驱动
End Function

Function closedb
cn.close:Set cn=Nothing
End function

function login()'=============登陆系统
Dim rStr,UserName:rStr = "":UserName=Request.Form("nn")
If isNL(UserName) Then
rStr="success:false,err:'昵称不能为空!'"
ElseIf Len(UserName)>20 Then
rStr="success:false,err:'昵称不能超过20个字符!'"
Else
Dim UserId,Key,cm:UserId="":Key=""
Call opendb
Set cm=Server.CreateObject("ADODB.Command")
cm.CommandType=adCmdStoredProc:cm.CommandText="ajaxLogin":cm.ActiveConnection=cn
cm.Parameters.Append cm.CreateParameter("@UserName",adVarChar,adParamInput,50,UserName)
cm.Parameters.Append cm.CreateParameter("@userid",adVarChar,adParamOutput,18)
cm.Parameters.Append cm.CreateParameter("@UserKey",adVarChar,adParamOutput,5)
cm.Execute ,,adExecuteNoRecords
UserId=cm.Parameters("@userid"):Key=cm.Parameters("@userkey")
If UserId="-1" Then
rStr="success:false,err:'发生错误,请稍后再试!'"
ElseIf UserId="0" Then
rStr="success:false,err:'已经存在此用户昵称,请修改您的昵称!'"
Else
rStr="success:true,UserId:'" & UserId & "',Key:'" & Key & "'"
End If
Call closedb
End If
login=rStr
end function

function logout()'==========退出系统
Dim rStr,UserId,Key:UserId=Request.Form("uid"):Key=Request.Form("key")
If isNL(UserId) Or isNL(Key) Then
logout="success:false,err:'用户信息丢失!'"
Exit Function
End If
Call opendb
Dim cm
Set cm=Server.CreateObject("ADODB.Command")
cm.CommandText="ajaxLogout"
cm.ActiveConnection=cn
cm.CommandType=adCmdStoredProc
cm.Parameters.Append cm.CreateParameter("@userid",adVarChar,adParamInput,18,UserId)
cm.Parameters.Append cm.CreateParameter("@userkey",adVarChar,adParamInput,5,Key)
cm.Parameters.Append cm.CreateParameter("@result",adInteger,adParamOutput)
cm.Execute ,,adExecuteNoRecords
If cm.Parameters("@result")="0" Then
rStr="success:false,err:'用户信息不存在!'"
Else
rStr="success:true"
End If
Call closedb
logout=rStr
end function

function readuser()'==========读取用户列表信息
Dim rStr,UserId:UserId=Request.Form("uid"):rStr=""
If isNL(UserId) Then
readuser="success:false,err:'用户Id信息丢失!'"
Exit Function
End If
UserId=Replace(UserId,"'","")'sql注入替换
Dim rs
Call opendb
Set rs=cn.Execute("exec ajaxReadUser '"&UserId&"'")
While Not rs.EOF
rStr=rStr&",{id:'"&rs(0)&"',nn:'"&js(rs(1))&"'}"
rs.MoveNext
Wend
rs.Close:Set rs=Nothing
Call closedb
If rStr<>"" Then
rStr="success:true,data:["&Right(rStr,len(rStr)-1)&"]"
Else
rStr="success:true,data:[]"
End If
readuser=rStr
end function

Function read()'==========读取信息列表
Dim rStr,UserId,Key:UserId=Request.Form("uid"):Key=Request.Form("key"):rStr=""
If isNL(UserId) Or isNL(key) Then
read="success:false,err:'用户信息丢失!'"
Exit Function
End If
UserId=Replace(UserId,"'","")'sql注入替换
key=Replace(key,"'","")'sql注入替换
Dim rs
Call opendb
Set rs=cn.Execute("exec ajaxRead '"&UserId&"','"&key&"'")
While Not rs.EOF
rStr=rStr&",'"&js(rs(0))&"'" '注意js替换
rs.MoveNext
Wend
rs.Close:Set rs=Nothing
Call closedb
If rStr<>"" Then
rStr="success:true,data:["&Right(rStr,len(rStr)-1)&"]"
Else
rStr="success:true,data:[]"
End If
read=rStr
end function

function say()'==========发言
Dim rStr,From,Key,ToUser,msg,cm
From=Request.Form("from"):Key=Request.Form("key"):ToUser=Request.Form("to"):msg=Request.Form("ct"):rStr=""
If isNL(from) Or isNL(key) Or isNL(ToUser) Or isNL(msg) Then
say="success:false,err:'信息传递不完整!'"
Exit Function
End If
Set cm=Server.CreateObject("ADODB.Command")
call opendb
cm.ActiveConnection=cn
cm.CommandText="ajaxsay"
cm.CommandType=adCmdStoredProc
cm.Parameters.Append cm.CreateParameter("@userkey",adVarChar,adParamInput,5,Key)
cm.Parameters.Append cm.CreateParameter("@from",adVarChar,adParamInput,18,from)
cm.Parameters.Append cm.CreateParameter("@to",adVarChar,adParamInput,18,ToUser)
cm.Parameters.Append cm.CreateParameter("@msg",adVarChar,adParamInput,800,msg)
cm.Parameters.Append cm.CreateParameter("@result",adInteger,adParamOutput)
cm.Execute ,,adExecuteNoRecords
If cm.Parameters("@result")="0" Then
rStr="success:false,err:'发表失败!\n原因:接收者已经不存在!'"
Else
rStr="success:true"
End If
Call closedb
say=rStr
end Function


json= "{":op= Request.Form("op")
if op= "login" then
Json =json&Login()
elseif op= "logout" then
Json =json&Logout()
elseif op="readuser" then
Json =Json&ReadUser()
elseif op="read" then
Json=json&Read()
elseif op="say" then
Json =json&Say()
else
Json = Json&"success:false,err:'参数错误!'"
end if
Json =json& "}"
Response.Write Json
%>
...全文
3562 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
召耳先生 2009-09-09
  • 打赏
  • 举报
回复
说实话,我看中了编辑器,嘎嘎,接分
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 hookee 的回复:]
以上代码 windows server 2003 + firefox3.5 测试下来
直接弹出 “调用类库函数发送信息”没发现弹出下载工具。 
是不是和系统或浏览器设置有关?
[/Quote]
我那是最新版FF,执行有,估计是一个BUG
rdnglydm 2009-09-09
  • 打赏
  • 举报
回复
很好,很强大。顶一下。
hookee 2009-09-09
  • 打赏
  • 举报
回复
以上代码 windows server 2003 + firefox3.5 测试下来
直接弹出 “调用类库函数发送信息”没发现弹出下载工具。
是不是和系统或浏览器设置有关?
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 hookee 的回复:]
sql2005下备份还原不出来
[/Quote]


hoho~~机子太烂,跑不起2005,只能用2000的。。...


把问题提取出来,精简一下。编辑器是可编辑的Iframe,不是textarea,


ie6,safari3.0.4,opera9,谷歌0.4 中都没出现问题,就是在firefox中出现了弹出下载对话框的问题。

在发送信息时要检查是否输入内容,所以如果为空时就alert提示信息为空,然后firefox就弹出下载对话框了,不管是ff2

还是ff3都存在这个问题。


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>无标题文档</title>
<style type="text/css">
#HtmlEditor{border:solid 1px black;margin:100px auto;display:block;width:600px;height:150px;}
</style>
</head>
<body>
<script type="text/javascript">
//firefox2.0.0.12 3.0.3
var IsIE=!!document.all;

function send(){
alert('调用类库函数发送信息!');
}

function setEditable(){
var editor=IsIE?document.frames["HtmlEditor"]:document.getElementById('HtmlEditor').contentWindow;
try{
var doc=editor.document;
if(doc.body){
doc.body.style.fontSize='14px';
doc.body.style.fontFamily="verdana";
doc.body.style.margin="4px";
}
doc.designMode="On";
if(IsIE)doc.contentEditable="True";
//==================初始化事件
initEvent(doc,editor);
}catch(e){alert(e)}
}
function initEvent(doc,editor){
if(IsIE){//=====================IE===================
doc.onkeydown=function(){
e=editor.event;//注意这里获取的是iframe中的事件对象
if(e.keyCode==13){
e.returnValue=false;
e.keyCode=0;
if(e.ctrlKey){send();return false;}
//在ie时回车生成<p>,替换为<br>.ff下生成<br>,所以不需要处理回车
var r=this.selection.createRange();
r.pasteHTML("<br>");
r.select();
}
}
}
else doc.addEventListener('keydown',function(e){
if(e.ctrlKey&&e.keyCode==13){
e.preventDefault();
e.stopPropagation();
//====================可以分别注释下面的句子试试就知道了=============
send();//在ff中马上使用alert提示时弹出下载工具,奇怪.
//setTimeout("send()",50);//延时就不会弹出下载工具
return false;}
},false);
};
</script>
<iframe ID="HtmlEditor" name="HtmlEditor" frameborder="0" marginheight="0" marginwidth="0" src="about:blank" onload="setEditable()"></iframe>
</body>
</html>
gxq323 2009-09-07
  • 打赏
  • 举报
回复
看错了,sqlserver啊
gxq323 2009-09-07
  • 打赏
  • 举报
回复
支持下,可惜没装mysql
mailbao 2009-09-07
  • 打赏
  • 举报
回复
高人腳下,虛心學習~~
凡夫与俗子 2009-09-07
  • 打赏
  • 举报
回复
ajax在Firefox里时常出现这个问题,不设置延时请求就会发生一些莫名的错误。查了些资料,当出现这些问题的时候只能设置延时。额,望楼主能解决这一问题,我参考参考。。嘿嘿。
hookee 2009-09-07
  • 打赏
  • 举报
回复
sql2005下备份还原不出来
  • 打赏
  • 举报
回复
firefox下如果使用快捷键ctrl+enter发送信息时,如果不延时调用发送函数,会弹出ff的下载对话框,奇怪。
--------

100分此问题。。。。


up下~~~~

wjf_2008 2009-09-07
  • 打赏
  • 举报
回复
支持
mkcat 2009-09-07
  • 打赏
  • 举报
回复
等待 高手回答....学习学习
number123456 2009-09-07
  • 打赏
  • 举报
回复
支持LZ,原创无敌
最近利用闲暇时间,作了个简单的聊天室,该聊天室使用 prototype.js (v1.4) 类库,主要应用Ajax技术、Application变量,做到小型架构,页面无刷新,[b]无数据库[/b],能查看在线用户等特点。

刚开始打算用access小型数据库,但考虑到多人在线时,这种轻量级的数据库承受能力将不能胜任存储任务,MSsql又不熟悉,我的空间也不支持,所以只往小型方向开发。所有聊天数据都存入服务器变量中,客户端与服务器的交互采用json的数据结构,效率还是相当高的。

写js也有一段时间了,发现再用vbscript写asp,有点不适应vb的语法,因此服务端application的全部使用Jscript操作。(js真tmd的自由!自由到连个像样子的IDE都没有-_-)。

当前已知的bug:
如果用户在任务管理器里终止ie进程,那么在线用户列表里将不能删除该用户名。(因为body元素的onunload没法运行-_-)

可以改进的地方:
1、客户端每隔n毫秒取一次数据,但当前返回的数据是整个application变量,比较长,可以只取最新的消息。这样可以改进数据交换的效率。
2、因为application不能太大,否则服务器必定挂掉,所以只好设置长度限制,超过n条记录后自动删除之前的消息,自动维护application的长度,听起来似乎是个好消息,但客户端也只能保存n条记录-_-,完全可以把所有记录在客户端缓存嘛。

28,406

社区成员

发帖
与我相关
我的任务
社区描述
ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
社区管理员
  • ASP
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧