使用IE浏览器作为前端载体,结合SQL Server 2000作为数据存储,通过XML格式传输消息,可以搭建一个轻量级的聊天程序,适合内部小范围使用场景。
开发环境准备
需要提前准备好以下环境:安装IE6及以上版本的浏览器作为客户端,部署SQL Server 2000数据库服务,服务端使用ASP脚本处理请求,确保IIS服务正常运行,支持ASP解析。
数据库设计
首先在SQL Server 2000中创建聊天程序所需的数据库和表结构,主要存储用户信息、聊天消息内容、发送时间等核心数据。
创建数据库和消息表
执行以下SQL语句创建数据库和消息存储表:
-- 创建聊天数据库
CREATE DATABASE ChatDB
GO
USE ChatDB
GO
-- 创建用户表
CREATE TABLE ChatUser (
UserID INT IDENTITY(1,1) PRIMARY KEY,
UserName NVARCHAR(50) NOT NULL,
LoginTime DATETIME DEFAULT GETDATE()
)
GO
-- 创建聊天消息表
CREATE TABLE ChatMessage (
MsgID INT IDENTITY(1,1) PRIMARY KEY,
SenderID INT NOT NULL,
ReceiverID INT NULL, -- 为NULL表示群发消息
MsgContent NVARCHAR(500) NOT NULL,
SendTime DATETIME DEFAULT GETDATE(),
FOREIGN KEY (SenderID) REFERENCES ChatUser(UserID)
)
GO
服务端ASP接口开发
服务端使用ASP编写接口,负责处理IE端发送的请求,完成消息的存储和查询,返回XML格式的数据给前端。
发送消息接口
该接口接收发送者ID、接收者ID、消息内容,将消息存入SQL Server 2000,返回操作结果XML。
<%@ Language="VBScript" %>
<%
' 设置响应格式为XML
Response.ContentType = "text/xml"
Response.Charset = "utf-8"
' 获取请求参数
senderID = Request.Form("senderID")
receiverID = Request.Form("receiverID")
msgContent = Request.Form("msgContent")
' 连接SQL Server 2000数据库
Set conn = Server.CreateObject("ADODB.Connection")
connStr = "Provider=SQLOLEDB;Data Source=127.0.0.1;Initial Catalog=ChatDB;User ID=sa;Password=123456;"
conn.Open connStr
' 插入消息SQL
sql = "INSERT INTO ChatMessage (SenderID, ReceiverID, MsgContent) VALUES (" & senderID & ", " & receiverID & ", '" & Replace(msgContent, "'", "''") & "')"
conn.Execute sql
' 返回成功XML
Response.Write "<?xml version='1.0' encoding='utf-8'?>"
Response.Write "<result>"
Response.Write "<code>0</code>"
Response.Write "<msg>消息发送成功</msg>"
Response.Write "</result>"
conn.Close
Set conn = Nothing
%>
获取消息接口
该接口根据用户ID查询未读消息,返回XML格式的消息列表。
<%@ Language="VBScript" %>
<%
Response.ContentType = "text/xml"
Response.Charset = "utf-8"
userID = Request.QueryString("userID")
lastMsgID = Request.QueryString("lastMsgID")
Set conn = Server.CreateObject("ADODB.Connection")
connStr = "Provider=SQLOLEDB;Data Source=127.0.0.1;Initial Catalog=ChatDB;User ID=sa;Password=123456;"
conn.Open connStr
' 查询发送给当前用户且ID大于最后已知消息ID的消息
sql = "SELECT m.MsgID, u.UserName AS SenderName, m.MsgContent, m.SendTime FROM ChatMessage m JOIN ChatUser u ON m.SenderID = u.UserID WHERE (m.ReceiverID = " & userID & " OR m.ReceiverID IS NULL) AND m.MsgID > " & lastMsgID & " ORDER BY m.SendTime ASC"
Set rs = conn.Execute(sql)
Response.Write "<?xml version='1.0' encoding='utf-8'?>"
Response.Write "<messages>"
Do While Not rs.EOF
Response.Write "<message>"
Response.Write "<msgID>" & rs("MsgID") & "</msgID>"
Response.Write "<senderName>" & Server.HTMLEncode(rs("SenderName")) & "</senderName>"
Response.Write "<content>" & Server.HTMLEncode(rs("MsgContent")) & "</content>"
Response.Write "<sendTime>" & rs("SendTime") & "</sendTime>"
Response.Write "</message>"
rs.MoveNext
Loop
Response.Write "</messages>"
rs.Close
Set rs = Nothing
conn.Close
Set conn = Nothing
%>
IE端前端开发
IE端使用原生的XMLHttpRequest对象发送请求,解析服务端返回的XML数据,实现消息的发送和实时获取。
消息发送功能实现
编写发送消息的函数,收集用户输入的内容,调用服务端发送接口。
// 当前用户ID,实际开发中从登录状态获取
var currentUserID = 1;
// 最后获取到的消息ID,用于增量拉取消息
var lastMsgID = 0;
// 发送消息函数
function sendMessage() {
var msgInput = document.getElementById("msgInput");
var msgContent = msgInput.value.trim();
if (msgContent === "") {
alert("请输入消息内容");
return;
}
// 接收者ID,这里设为null表示群发,实际可改为指定用户ID
var receiverID = "NULL";
var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
xmlhttp.open("POST", "send_msg.asp", true);
xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async = false;
xmlDoc.loadXML(xmlhttp.responseText);
var code = xmlDoc.getElementsByTagName("code")[0].text;
if (code == "0") {
msgInput.value = "";
// 发送成功后拉取最新消息
getNewMessages();
} else {
alert("消息发送失败");
}
}
};
var postData = "senderID=" + currentUserID + "&receiverID=" + receiverID + "&msgContent=" + encodeURIComponent(msgContent);
xmlhttp.send(postData);
}
消息获取与展示功能实现
定时调用获取消息接口,解析XML数据并展示到页面中。
// 获取新消息函数
function getNewMessages() {
var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
xmlhttp.open("GET", "get_msg.asp?userID=" + currentUserID + "&lastMsgID=" + lastMsgID, true);
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async = false;
xmlDoc.loadXML(xmlhttp.responseText);
var messages = xmlDoc.getElementsByTagName("message");
for (var i = 0; i < messages.length; i++) {
var msgID = messages[i].getElementsByTagName("msgID")[0].text;
var senderName = messages[i].getElementsByTagName("senderName")[0].text;
var content = messages[i].getElementsByTagName("content")[0].text;
var sendTime = messages[i].getElementsByTagName("sendTime")[0].text;
// 展示消息到页面
var msgList = document.getElementById("msgList");
var li = document.createElement("li");
li.innerHTML = "[" + sendTime + "] " + senderName + ":" + content;
msgList.appendChild(li);
// 更新最后消息ID
lastMsgID = msgID;
}
// 滚动到消息列表底部
var msgContainer = document.getElementById("msgContainer");
msgContainer.scrollTop = msgContainer.scrollHeight;
}
};
xmlhttp.send();
}
// 页面加载后每3秒拉取一次新消息
window.onload = function() {
getNewMessages();
setInterval(getNewMessages, 3000);
};
前端页面结构
聊天页面的基本结构如下:
<html>
<head>
<title>XML聊天程序</title>
<style>
#msgContainer { width: 500px; height: 300px; border: 1px solid #ccc; overflow-y: auto; padding: 10px; }
#msgList { list-style: none; padding: 0; }
#msgList li { margin-bottom: 8px; padding: 5px; border-bottom: 1px solid #eee; }
#inputArea { margin-top: 10px; }
#msgInput { width: 400px; height: 30px; }
#sendBtn { height: 36px; width: 80px; }
</style>
</head>
<body>
<h2>XML聊天室</h2>
<div id="msgContainer">
<ul id="msgList"></ul>
</div>
<div id="inputArea">
<input type="text" id="msgInput" placeholder="请输入消息内容" />
<button id="sendBtn" onclick="sendMessage()">发送</button>
</div>
<script>
// 这里放入前面定义的sendMessage、getNewMessages等函数代码
</script>
</body>
</html>
开发注意事项
- SQL Server 2000的密码和连接字符串需要根据实际部署环境修改,避免使用弱密码。
- IE浏览器对XMLDOM的支持需要使用ActiveXObject,低版本IE可能需要调整安全设置允许ActiveX运行。
- 消息内容需要做特殊字符过滤,避免SQL注入和XML解析错误,上面的代码已经做了基础的单引号转义处理。
- 定时拉取消息的间隔可以根据实际需求调整,间隔太短会增加服务端压力,太长会影响消息实时性。
- 如果需要支持私聊功能,只需要修改发送接口的参数,将receiverID设置为指定用户的ID即可。
IESQL_Server_2000XML聊天程序ASP修改时间:2026-06-30 10:46:08