ASP_Ajax聊天室

<%@ CODEPAGE=65001 %><%
'///
'// AJAX Chat Room
'// 作 者: duduwolf
'// 版权所有: 嘟嘟老窝(http://www.duduwolf.com/)
'// 技术支持: duduwolf@hotmail.com
'///
Option Explicit
'On Error Resume Next
Response.Buffer = true

Dim act
act = Request("act")

Const CHAT_SESSION = "CHAT_ROOM_AJAX_SESSION"
Const CHAT_MSG = "CHAT_ROOM_AJAX_MSG"
Const CHAT_NICKNAME = "CHAT_ROOM_AJAX_NICKNAME"

Dim SessionArray, MsgArray, i, onlineCount

If Not IsEmpty(Application(CHAT_SESSION)) Then
Application.Lock
SessionArray = Split(Application(CHAT_SESSION), ",")
MsgArray = Split(Application(CHAT_MSG), Chr(13))
Application.UnLock
Else
'Application.Lock
'Application(CHAT_SESSION) = Session.SessionID
'Application.UnLock
End If

Function FindArray(Arr, Var)
If IsEmpty(Arr) Or IsNull(Arr) Then
FindArray = -1
Exit Function
End If

If UBound(Arr) = 0 Then
FindArray = -1
Else
For i = 0 To UBound(Arr)
If Arr(i) = Var Then
FindArray = i
Exit Function
End If
Next
End If

FindArray = -1
End Function

If Request.ServerVariables("REQUEST_METHOD") = "POST" Then
Response.Clear
Response.ContentType = "text/xml"

Dim xmlHead, xmlFoot, msg

xmlHead = "<?xml version=""1.0"" encoding=""UTF-8"" standalone=""yes"" ?><chatroom online=""" & onlineCount & """ self=""" & Session(CHAT_NICKNAME) & """>"
xmlFoot = "</chatroom>"

If act = "sendChat" Then
If IsNull(SessionArray) Or IsEmpty(SessionArray) Then Response.End

msg = "<msg nick=""" & Request("nick") &""">" & Request("msg") & "</msg>"
For i = 0 To UBound(SessionArray)
If SessionArray(i) <> Session.SessionID Then
MsgArray(i) = MsgArray(i) & Chr(10) & msg
Application.Lock
Application(CHAT_MSG) = Join(MsgArray, Chr(13))
Application.UnLock
End If
Next

Response.Write xmlHead
Response.Write "<msg nick=""" & Session(CHAT_NICKNAME) &""">" & Request("msg") & "</msg>"
Response.Write xmlFoot

ElseIf act = "getChat" Then
Dim pos
pos = FindArray(SessionArray, Session.SessionID)
If pos > -1 Then
If IsArray(MsgArray) Then
Dim Arr
If MsgArray(pos) <> "" Then
Response.Write xmlHead
Arr = Split(MsgArray(pos), Chr(10))
If Not IsEmpty(Arr) And UBound(Arr) >= 0 Then
For i = 0 To UBound(Arr)
Response.Write Arr(i)
Next
End If
Response.Write xmlFoot
MsgArray(pos) = ""
Application.Lock
Application(CHAT_MSG) = Join(MsgArray, Chr(13))
Application.UnLock
End If
End If
End If
ElseIf act = "login" Then
If Len(Request("nick")) > 0 Then
Dim nickArr
If Not IsEmpty(Application(CHAT_NICKNAME)) Then
nickArr = Split(Application(CHAT_NICKNAME), Chr(10))
If Not IsEmpty(nickArr) Then
For i = 0 To UBound(nickArr)
If nickArr(i) = Request("nick") Then
Response.Write xmlHead
Response.Write "<login nick=""" & Session(CHAT_NICKNAME) & """>昵称[" & Request("nick") & "]已经被其他用户选用,请更改昵称!</login>"
Response.Write xmlFoot
Response.End
End If
Next
End If
End If
If FindArray(SessionArray, Session.SessionID) = -1 Then
Application.Lock
If IsEmpty(SessionArray) Then
Application(CHAT_SESSION) = Session.SessionID
SessionArray = Split(Application(CHAT_SESSION), ",")
Application(CHAT_MSG) = ""
MsgArray = Split(Application(CHAT_MSG), Chr(13))
Application(CHAT_NICKNAME) = Request("nick")
Else
Application(CHAT_SESSION) = Join(SessionArray, ",") & "," & Session.SessionID
SessionArray = Split(Application(CHAT_SESSION), ",")
Application(CHAT_MSG) = Join(MsgArray, Chr(13)) & Chr(13) & ""
MsgArray = Split(Application(CHAT_MSG), Chr(13))
Application(CHAT_NICKNAME) = Application(CHAT_NICKNAME) & Chr(10) & Request("nick")
End If

Application.UnLock

If IsNull(SessionArray) Or IsEmpty(SessionArray) Then Response.End

For i = 0 To UBound(SessionArray)
If SessionArray(i) <> Session.SessionID Then
MsgArray(i) = MsgArray(i) & "<system>用户[" & Request("nick") & "]进入了聊天室</system>" & Chr(10)
Application.Lock
Application(CHAT_MSG) = Join(MsgArray, Chr(13))
Application.UnLock
End If
Next
End If
Session(CHAT_NICKNAME) = Request("nick")

Response.Write xmlHead
Response.Write "<login nick=""" & Session(CHAT_NICKNAME) & """>OK</login><system>用户[" & Session(CHAT_NICKNAME) & "]进入了聊天室</system>"
Response.Write xmlFoot
End If
ElseIf act = "logout" Then
Dim str, str1, str2
If Not IsEmpty(Application(CHAT_NICKNAME)) Then
nickArr = Split(Application(CHAT_NICKNAME), Chr(10))
End If

For i = 0 To UBound(SessionArray)
If SessionArray(i) <> Session.SessionID Then
If i = 0 Then
str = SessionArray(i)
str1 = MsgArray(i)
str2 = nickArr(i)
Else
str = str & "," & SessionArray(i)
str1 = str1 & Chr(10) & MsgArray(i) & Chr(13) & "<system>用户[" & request("nick") & "]退出了聊天室!</system>"
str2 = str2 & Chr(10) & nickArr(i)
End If

End If
Next

Application.Lock
Application(CHAT_SESSION) = str
Application(CHAT_MSG) = str1
Application(CHAT_NICKNAME) = str2
Application.UnLock
End If

ElseIf act = "script" Then
Response.Clear
Response.ContentType = "text/javascript"%>

//*********************************************************
// 目的: AJAX类
// 输入: 无
// 返回: 返回XMLHttp对象
// 例子: var myConn = new XHConn();
//
// if (!myConn) alert("XMLHTTP not available. Try a newer/better browser.");
//
// var fnWhenDone = function (oXML) { alert(oXML.responseText); };
//
// myConn.connect("mypage.php", "POST", "foo=bar&baz=qux", fnWhenDone);
//
//*********************************************************
function XHConn()
{
var xmlhttp = false, bComplete = false;
try { xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); }
catch (e) { try { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); }
catch (e) { try { xmlhttp = new XMLHttpRequest(); }
catch (e) { alert(e);xmlhttp = false; }}}
if (!xmlhttp) return null;
this.connect = function(sURL, sMethod, sVars, fnDone, parObj)
{
if (!xmlhttp) return false;
bComplete = false;
sVars = (sVars == '') ? Math.random() : sVars + '&' + Math.random( );
sMethod = sMethod.toUpperCase();

try {
if (sMethod == "GET")
{
xmlhttp.open(sMethod, sURL + '?' + sVars, true);
xmlhttp.setRequestHeader("Content-Type", "text/html;charset=GB2312");
sVars = "";
}
else
{
xmlhttp.open(sMethod, sURL, true);
xmlhttp.setRequestHeader("Method", "POST "+sURL+" HTTP/1.1");
xmlhttp.setRequestHeader("Content-Type",
"application/x-www-form-urlencoded");
}
xmlhttp.onreadystatechange = function(){
if (xmlhttp.readyState == 4 && !bComplete)
{
bComplete = true;
fnDone(xmlhttp, parObj);
}};
xmlhttp.send(sVars);
}
catch(z) { return false; }
return true;
};
return this;
}
var URL, VAR;
//*****************************************************
// 聊天类
//*****************************************************
var ChatRoom = function(obj, parentWin, w, h) {

this.style = {
width : w ? w : 500, //宽
height : h ? h : 300 //高
}

this.obj = obj; //聊天类的实际DOM名称
this.parentWin = parentWin ? parentWin : null; //聊天窗口的父级DOM对象
this.input = null; //聊天信息输入框
this.chatWin = null; //聊天信息显示DOM对象
this.login = null; //昵称输入框
this.loginBtn = null; //登陆(退出)按钮
this.conn = new XHConn(); //AJAX对象
if (!this.conn) alert("XMLHTTP not available. Try a newer/better browser.");
this.serverUrl = null; //服务端请求路径
this.can = false; //聊天室初始化是否正常

this.nickName = '匿名'; //登陆昵称
this.onlineCount = -1; //在线人数

this.createChatRoom();

VAR = 'act=logout&nick=' + this.nickName;
URL = this.serverUrl;

if ( typeof window.addEventListener != "undefined" )
 window.addEventListener( "onbeforeunload", this.logout1, false );

// IE
else if ( typeof window.attachEvent != "undefined" ) {
window.attachEvent( "onbeforeunload", this.logout1);
}

else {
if ( window.onbeforeunload != null ) {
var oldOnunload = window.onbeforeunload;
window.onbeforeunload = function ( e ) {
oldOnunload( e );
this.logout1;
};
}
else
window.onbeforeunload = this.logout1;
}

return this;
}

//创建聊天相关的DOM对象
ChatRoom.prototype.createChatRoom = function() {
if (!this.parentWin || this.parentWin == null || typeof (this.parentWin) != 'object') {
alert('无法加载聊天窗口,请查看调用代码是否正确');
return;
}

this.createStyle();
this.parentWin.innerHTML = '请输入你的昵称:<input type="text" size="10"> <input type="button" οnclick="' + this.obj + '.loging();" value="登陆"><div class="chatroom"></div><input type="text" style="width:' + (this.style.width - 40) + ';" οnkeypress="if(event.keyCode==13)' + this.obj + '.sendChat();"> <button οnclick="' + this.obj + '.sendChat();">发送</button>';
this.login = this.parentWin.getElementsByTagName('input')[0];
this.loginBtn = this.parentWin.getElementsByTagName('input')[1];
this.input = this.parentWin.getElementsByTagName('input')[2];
this.chatWin = this.parentWin.getElementsByTagName('div')[0];

var o = document.getElementsByTagName("script");
for (var i = 0; i < o.length; i++) {
len = o[i].src.indexOf('chatRoom.asp');
if (len > -1) {
this.serverUrl = o[i].src.substring(0, len + 12);
break;
}
}

if (!this.serverUrl || this.serverUrl.length == 0) {
alert('程序初始化出错');
retur;
}

this.can = true;

this.getChat(true);
}

//创建相关样式表
ChatRoom.prototype.createStyle = function() {
document.write('<style>');
document.write('.chatroom{');
document.write('width:' + this.style.width + 'px;');
document.write('height:' + this.style.height + 'px;');
document.write('overflow-y:scroll;');
document.write('border:1px solid #000');
document.write('margin:10px;');
document.write('padding-bottom:50px;');
document.write('}');
document.write('.chatroom li{');
document.write('list-style-type:none;');
document.write('padding:3px 0 3px 0;');
document.write('}');
document.write('.self{');
document.write('color:#269926;');
document.write('}');
document.write('</style>');
}

//发送消息
ChatRoom.prototype.sendChat = function() {
if (!this.can) return;
if (!this.logined) {
alert('请先登陆!');
this.login.focus();
return;
}

var msg = this.input.value;
if (msg && msg.length > 0) {
msg = 'act=sendChat&msg=' + this.encode(msg) + '&nick=' + this.nickName;
this.conn.connect(this.serverUrl, 'POST', msg, this.fnResponse, this);
this.input.value = '';
}
}

//从服务端取得最新的聊天信息
ChatRoom.prototype.getChat = function(first) {
if (!this.can) return;
if (!this.logined && !first) return;
var sVar = "act=getChat";
this.conn.connect(this.serverUrl, 'POST', sVar, this.fnResponse, this);
var obj = this;
window.setTimeout(function(){obj.getChat();}, '1000');
}

//登陆聊天室
ChatRoom.prototype.loging = function() {
if (this.loginBtn.value == '退出') {
this.logout();
return;
}

if (!this.can) return;
if (this.login.value.length == 0) {
alert('请输入昵称!');
this.login.focus();
return;
}
if (this.login.value.length > 20) {
alert('昵称太长了吧,最多十个汉字!');
this.login.focus();
this.login.select();
return;
}

var sVar = 'act=login&nick=' + this.login.value;
this.nickName = this.login.value;
VAR = 'act=logout&nick=' + this.nickName;
this.conn.connect(this.serverUrl, 'POST', sVar, this.fnResponse, this);
}

//退出聊天室
ChatRoom.prototype.logout = function() {
if (!this.can) return;
if (!this.logined) return;
var sVar = 'act=logout&nick=' + this.nickName;
this.conn.connect(this.serverUrl, 'POST', sVar, this.fnResponse, this);
this.logined = false;
this.loginBtn.value = '登陆';
}

//退出聊天室1
ChatRoom.prototype.logout1 = function() {
if (document.getElementsByTagName("INPUT")[1].value == '退出') {
var conn = new XHConn();
conn.connect(URL, 'POST', VAR, function(){}, this);
}
}

//编码字符串
ChatRoom.prototype.encode = function(str) {
return encodeURIComponent(str);
}

//处理AJAX服务端返回的代码
ChatRoom.prototype.fnResponse = function(oXml, parObj) {
//if (oXml.responseText.length > 0) alert(oXml.responseText);
var xmlDoc = oXml.responseXML.documentElement;
if (xmlDoc && typeof xmlDoc == 'object') {
parObj.parseXML(xmlDoc);
}
}

//解析服务端传回的XML代码,并进行相应操作
ChatRoom.prototype.parseXML = function(xmlDoc) {
var attList = xmlDoc.attributes;
if (attList && attList.length == 2 ) {
if (attList[0].name == 'online')
this.onlineCount = attList[0].value;
if (attList[1].name == 'self')
this.self = attList[1].value;

if (this.self.length > 0) this.logined = true;
}

var arr = xmlDoc.childNodes, newChat, str;
for (var i = 0; i < arr.length; i++) {
if (arr[i] && arr[i].nodeName == 'msg' &&
arr[i].childNodes[0].nodeType == 3 &&
arr[i].childNodes[0].nodevalue.length > 0) {

newChat = document.createElement('LI');
this.chatWin.appendChild(newChat);
str = '';

if (arr[i].attributes[0].name == 'nick') {
if (arr[i].attributes[0].value == this.self)
str += '<span class="self">你说:</span>';
else
str += arr[i].attributes[0].value + '说:';

str += arr[i].childNodes[0].nodevalue;

newChat.innerHTML = str;
this.chatWin.scrollTop = this.chatWin.scrollHeight;
}
} else if (arr[i] && arr[i].nodeName == 'system' &&
arr[i].childNodes[0].nodeType == 3 &&
arr[i].childNodes[0].nodevalue.length > 0) {

newChat = document.createElement('LI');
this.chatWin.appendChild(newChat);
str = '<span style="color:blue">系统:</span>' + arr[i].childNodes[0].nodevalue;
newChat.innerHTML = str;
this.chatWin.scrollTop = this.chatWin.scrollHeight;
} else if (arr[i] && arr[i].nodeName == 'login' &&
arr[i].childNodes[0].nodeType == 3 &&
arr[i].childNodes[0].nodevalue.length > 0) {
if (arr[i].childNodes[0].nodevalue == 'OK') {
this.logined = true;
this.loginBtn.value = '退出';
this.getChat();
} else {
alert(arr[i].childNodes[0].nodevalue);
}
}
}
}

<%End If%>

开发语言为Asp,服务器脚本为VBScript; AJAX部分采用JQuery框架,功能代码均为原创;数据库暂时采用ACCESS; --------- 程序功能: 多人即时聊天;新信息声音提示;用户自主选择表情和颜色; 管理员删除信息/踢出用户;高强度管理密码; 数据库压缩; --------- 程序特色 特色?没什么特色!普通的ASP、普通的HTML、普通的JavaScript、还有一个普通的程序编写者; 唯有一点----本程序为原创,没有参考任何其他类似程序 --------- 默认管理员和密码都是admin 一、配置 用记事本打开inc文件夹下的conn.asp,注意如下代码 '聊天室配置 dim admins: admins="anlige,admin" '管理员用户,可自行配置,每个管理员以英文逗号(,)分割;无数量限制 dim pwd: pwd="43894a0e21232f297a57a5a743894a0e4a801fc3" '管理密码,所有管理员使用一个密码!本密码经MD5加密 dim adminToFront: adminToFront=false '管理员登录后是否同步显示到前台(注意,如果设置true,则登录后台的同时登录前台,前台无需再用另一账号),建议设置为false dim msgExpires: msgExpires=300 '信息过期时间,以分钟为单位,系统自动删除过期的信息 dim userExpires: userExpires=20 '用户过期时间,以分钟为单位,系统自动踢出20分钟不发言的用户 '结束配置 配置结束后保存! ____________________________________________________注意(关于密码)_____________________________________________________________________ 密码使用特殊MD5加密算法加密,如要修改密码请按如下方法修改: 假如你的聊天室地址为http://www.***.com/chat/ 访问http://www.***.com/chat/getmd5.asp?string=你要设置的密码,例如http://www.***.com/chat/getmd5.asp?string=admin 然后会显示一串字符串,上例的话会显示43894a0e21232f297a57a5a743894a0e4a801fc3 将inc/conn.asp代码中pwd的值修改为显示的字符串,保存!下次管理员登录就可以用admin这个作为密码登录,建议修改密码后移动getmd5.asp文件 _______________________________________________________________________________________________________________________________________ 二、使用 聊天室默认地址为index.html,直接访问http://www.***.com/chat/index.html即可进入聊天室 具体使用方法请参考help.html 本程序皮肤使用的是QQ2008的聊天皮肤,有兴趣可以自己做皮肤,注意布局! 三、关于 您可以免费使用本程序,请保留代码中的注释信息,谢谢! 请勿利用本程序来实施任何违反法律的行为;否则,一切后果自负! 请保留作者版权信息,尽管不是什么大程序,但作者近期发现很多使用者连开发人都改成自己的名字,这既是对别人劳动成果的不尊重,也是一个人素质的体现
鱼鱼 WEB IM 20090420 本程序版权归鱼鱼qq260332019所有, 此程序非经鱼鱼许可禁止用于商业用途, 作者保留该程序名称、源码的所有相关权利] 源码没有丝毫保留,全部开放提供,请大家多提修改意见. 源码没有丝毫保留,全部开放提供,请大家多提修改意见. 源码没有丝毫保留,全部开放提供,请大家多提修改意见. '转发时请保留此声明信息,这段声明不并会影响你的速度! '*************************鱼鱼 WEB IM 2008-2009*********************************** ' '作者 鱼鱼(qq:260332019) '网站:http:// '电子邮件:260332019@qq.com 'WEB开发群:4531488 'QQ:260332019 '版权声明:版权所有,源代码公开,除商业用途外其他各种用途均可免费使用,但是修改后必须把修改后的文件 '发送一份给作者.并且保留作者此版权信息 '****************************************************************************** 目标:以前写过漫漫,但还不够好,鱼鱼要改进,比漫漫更好 在鱼鱼基础上开发各种WEB应用,挂接到鱼鱼上,不断扩展 以鱼鱼为核心,完善鱼鱼好友、群、组等基本聊天功能 扩展鱼鱼,与各种WEB应用紧密结合,鱼鱼号码做为接口 发展鱼鱼,努力构建WEB版腾讯QQ,打造鱼鱼通用平台 以鱼鱼平台为基础,开发各种WEB应用平台,凝聚平台效应 努力使鱼鱼更加优秀,让鱼鱼成为很好很强大的在线平台 运行regdll.bat注册fish.dll,然后可以正常访问,测试号码10000~10100,密码都为1 文件夹app是小应用文件夹,可扩展鱼鱼webim 2008-10-17开始写鱼鱼 2008-10-18上午 基本完成数据库设计,包括了鱼鱼群表等,完成好友列表框架 2008-10-19完善好友列表框架,好友列表按状态显示,增加好友状态图标显示, 增加鱼鱼号码等级、头像、图标等 2008-10-21解决好友列表和在线人数无法显示bug,使用clng转换类型 注意条件判断时用clng转换鱼鱼号码 增加消息收发、查找用户 2008-10-23完善消息收发 2008-10-24增加鱼鱼个人设置,鱼鱼资料查看 2008-10-25艰难的完善好友操作,由于数据库设计得有些奇怪,程序非常难写,且问题很多 添加分组操作,增加分组消息提示 2008-10-26增加系统信息,上下栏,初步集成多用户博客平台 性能测试,结果显示好友人数200上限,还凑合 人数再多的话,由于10秒刷新好友列表,请求得不到即时响应,使用起来会不流畅 2008-10-27清晰化好友添加、删除、加入黑名单、移动好友的逻辑 2008-10-28增加发消息时表情选择 2008-11-19增加好友列表图标 2008-11-25修改左侧栏、左侧列表指针显示为默认箭头,用户登录后自动删除1周前所有聊天消息 2009-1-4 增加鱼鱼应用 2009-1-19 增加聊天窗口图标 2009-4-17 修改了一些程序错误 2009-4-20 修改了一些程序错误 微蓝#CEDFF6 #F5FAFE 淡蓝#D5E3F4 #E4EFF8 #A4C3F6 #DBE1F4 #C5D6EF #C5E3F5 #E8F7FD #D5EBF9 #E3ECF9 #EFF9FE 浅蓝#A6C5E8 #BED7ED #DCEBFB #D4E3F6 #D3D8FD #D1E7FC 深蓝#4B92D9 #59AAEE #6891D3 #179BF6 #00551A #89AACF #D5E1EE #F5FAFE
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值