新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     >>计算机科学论坛<<     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> XML网站展示,XML源代码,XML编程示例。 本版仅接受原创、转贴、网站展示,具体的技术交流请前往各相关版块。
    [返回] 计算机科学论坛XML.ORG.CN讨论区 - XML技术『 XML源码及示例(仅原创和转载) 』 → [求助]XML聊天室 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 3154 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: [求助]XML聊天室 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     grandia 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:0
      积分:53
      门派:XML.ORG.CN
      注册:2005/4/11

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给grandia发送一个短消息 把grandia加入好友 查看grandia的个人资料 搜索grandia在『 XML源码及示例(仅原创和转载) 』的所有贴子 引用回复这个贴子 回复这个贴子 查看grandia的博客楼主
    发贴心情 [求助]XML聊天室

    小弟刚学XML,用其做一个不用数据库的聊天室,不巧遇到人生一大难题,特来此求助于各位高手,源码如下:
    1 StartChatroom.asp
    <!--StartChatroom.asp是在启动聊天室,初始化Application变量的值,其程序代码,如下所示:-->

    <%
    '建立聊天室的XML DOM
    Set xmlDom = Server.CreateObject("MSXML2.DOMDocument.4.0")
    xmlDom.async = "false"
    xmlDom.loadXML("</>")
    <!--上述代码是建立XML聊天信息的根元素chatroom,并且建立成为一个XML DOM对象。-->

    '建立Application变量存储聊天室信息
    Application("ChatMessages") = xmlDom.xml
    Application("MaxMessages") = 100
    Application("DelMessages") = 80
    Application("FirstTimeMsgs") = 10

    '转向聊天室
    Response.Redirect("default.asp")
    %>


    2.default.asp
    <!--default.asp是登陆聊天室的窗体和处理程序,主要是获取登陆的用户名称,即Session变量UserName-->
    <%
    strName = Request.Form("UserName")
    If strName<>"" Then
      Session("UserName") = strName
      Response.Redirect("Chatroom.asp")
    End If
    %>
    <!-- 上述程序块为窗体处理程序,在获取输入的字段内容后,在第4行指定Session变量,第5行转向到聊天室主画面Chatroom.asp-->

    <HTML>
    <HEAD>
    <TITLE>XML聊天室</TITLE>
    </HEAD>
    <BODY bgcolor="#FFCC99">
    <BR>
    <CENTER>
    <B>请输入用户名称登陆聊天室</B><BR>
    <FORM action="default.asp" method="POST">
    <TABLE border=2>
      <TR><TD>用户名称:</TD><TD>
      <%
      If Not IsNull(Session("UserName")) Then
        Response.Write"<input type='TEXT' name='UserName' value='"& Session("UserName")& "'maxlength=12 maxsize=12>"
      Else
        Response.Write"<input tyep='TEXT' name='UserName' maxlength=12 maxsize=12>"
      End if
      %>
      </TD></TR>
      <TR><TD align=center colspan=2>
        <INPUT type="Submit" value="进入聊天室">
      </TD></TR>
    </TABLE>
    </FORM>
    <BR>
    </CENTER>
    </BODY>
    </HTML>

    3.Chatroom.asp

    <!--Chatroom.asp就是整个聊天室的主页面-->

    <HTML>
    <HEAD>
    <META http-equiv="Content-Type" content="text/html;charset=GB2312">
    <TITLE>XML聊天室</TITLE>
    <SCRIPT language="Javascript">
    var enterRoom = true
    var blnotLoadingChatMsgs = true
    <!--上述第6行的变量enterRoom为一个标志,标志用户是否刚刚进入聊天室,第7行的变量blnotLoadingCharMsgs标志是否已经加载聊天信息-->

    //获取聊天信息
    function getChatMessage(){
      if (blnotLoadingChatMsgs){
        //第一次获取聊天信息
        blnotLoadingChatMsgs = false
        getxmlHttp = new ActiveXObject("MSXML2.XMLHTTP.4.0")
        xmlDom = new ActiveXObject("MSXML2.DOMDocument.4.0")
        xmlDom.async = false
        getxmlHttp.onreadystatechange = showChatMessage
        //发送第一次获取聊天信息
        var xmlDomStr = "<control>"
        xmlDomStr = "<control>"
        xmlDomStr = xmlDomStr + "<enter>" +enterRoom + "</enter>"
        xmlDomStr = xmlDomStr + "</control>"
        xmlDom.loadXML(xmlDomStr)
        enterRoom = false
        getxmlHttp.open("POST","getChatXML.asp",true)
        getxmlHttp.send(xmlDom)
      }
    }
    <!--上述函数getChatMessage加载服务器端的聊天信息,blnotLoadingChatMsgs标志设为false表示已经加载,在第16行设定onreadystatechange事件的处理程序为showChatMessage,这个函数显示聊天信息-->
    <!--在18~20行建立控制的XML文件,发送标志enterRoom的值,在第23行打开HTTP的请求,目的地为getChatXML.asp程序文件,发送的是控制XML文件的XML DOM对象,因为已经进入聊天室,所以第22行的enterRoom标志设为false-->

    //显示聊天信息
    function showChatMessage(){
      if (getxmlHttp.readystate==4){
        blnotLoadingChatMsgs=true
        if (getxmlHttp.responseXML.xml !=""){
          var msgxmlDom=getxmlHttp.responseXML
          var messageNodes=msgxmlDom.documentElement.selectNodes("message")
          //获取聊天信息
          for (i=0;i<messageNodes.length;i++){
            msgNode=messageNodes(i)
            //获取信息内容
            objText=msgNode.selectSingleNode("text")
            objUser=msgNode.selectSingleNode("user")
            objSay=msgNode.selectSingleNode("say")
            objColor=msgNode.selectSingleNode("color")
            strMessage=ChatMessages.innerHTML
            strMessage=strMessage + "<FONT color=" + objColor.text +"><B>" + objUser.text +"</B>:"
            strMessage=strMessage + "<SMALL>" + objSay.text + "</SMALL> -"
            strMessage=strMessage + objText.text + "</FONT><BR>"
            ChatMessages.innerHTML = strMessage
            ChatMessages.scrollIntoView(false)
          }
        }
      }
    }
    <!--当执行getChatMessage函数的HTTP请求时,在完成后就会触发onreadystatechange事件,其中readystate值4表示完成请求,在第32行获取响应的XML DOM对象,这个对象就是聊天信息的XML文件-->
    <!--在第33行获取所有message元素,第35~48行的for循环显示所有的聊天信息,在第46行指定聊天信息,第47行设定窗口滚动为false,可以看到最新的消息-->

    //更新聊天信息
    function updateChatMessage(){
       //是否有聊天信息
      if (chatmsg.value !=""){
        var strMessage=chatmsg.value.replace(/</g," ")
        postxmlHttp=new ActiveXObject("MSXML2.XMLHTTP.4.0")
        xmlDom=new ActiveXObject("MSXML2.DOMDocument.4.0")
        xmlDom.async=false
        xmlDomStr="<message>"
        xmlDomStr=xmlDomStr + "<text>" + strMessage + "</text>"
        xmlDomStr=xmlDomStr + "<user><%=Session("UserName")%></user>"
        xmlDomStr=xmlDomStr + "<say>" + say.value +"</say>"
        xmlDomStr=xmlDomStr + "<color>" +msgcolor.value + "</color>"
        xmlDomStr=xmlDomStr + "</message>"
        xmlDom.loadXML(xmlDomStr)
        postxmlHttp.onreadystatechange=showMessageCount
        postxmlHttp.open("POST","updateChatXML.asp",true)
        postxmlHttp.send(xmlDom)
        chatmsg.value=""
      }
    }
    <!--如果在55行有输入信息内容,第60~65行建立聊天信息的message元素,在第66行建立XML DOM对象-->
    <!--在第67行设定onreadystatechange事件的处理程序showMessageCount,第68行将信息的XML DOM对象送到updateChatXML.asp程序,最后在第70行设定信息为空字符串-->

    //显示聊天信息数
    function showMessageCount(){
      if(postxmlHttp.readystate==4){
        CountMessages.innerHTML=postxmlHttp.responseText
      }
    }
    </SCRIPT>
    <!--showMessageCount函数就在updateChatMessage函数发送更新信息后,在第76行获取响应的文字内容,这个内容为聊天信息数-->

    <SCRIPT for="window" event="onLoad">
    //设定执行getChatMessage函数的间隔时间
    window.setInterval(getChatMessage,1000)
    ChatMessages.innerHTML="<B>XML聊天室:<%=Session("UserName")%></B><BR>"
    CountMessages.innerHTML="未知"
    </SCRIPT>
    <!--在加载HTML文件后就会执行此块的JavaScript程序代码,在第82行设定每1000个间隔时间执行getChatMessage函数,也就是定时更新服务器端的聊天信息,第83~84行为HTML标记的初始内容,在聊天信息窗口显示登陆的用户名称-->

    </HEAD>
    <BODY bgcolor="#FFCC99">
    <DIV align="center">
    <DIV align="left" STYLE="font:10pt;overflow-y:scroll;width=90%;height=480;background-color=#CCCCFF;">
      <DIV id="ChatMessages"></DIV>
    </DIV>
    <!--在第88~92行为两层的<DIV>对象标记,外面的<DIV>对象标记显示聊天信息窗口,显示垂直和水平滚动条,内部的对象名称为ChatMessages,显示的就是聊天信息-->
    <TABLE bgcolor="#CCCC99" width="90%" cellspacing="5">
      <TR><TD ALIGN=CENTER VALIGN=TOP>
        <FONT size=2>信息:</FONT>
        <INPUT id="chatmsg" type="text" size=40 name="message">
      </TD><TD ALIGN=CENTER VALIGN=TOP>
        <FONT size=2 color=#000000>语气</FONT>
        <SELECT id="say" name="usersay" size="1">
          <OPTION value="~十分高兴的说">高兴</OPTION>
          <OPTION value="~有些难过的说">难过</OPTION>
          <OPTION value="~哭天喊地的说">伤心</OPTION>
          <OPTION value="~脸红生气的说">生气</OPTION>
          <OPTION value="~嘴巴吐血的说">吐血</OPTION>
          <OPTION value="~有点想睡的说">想睡</OPTION>
        </SELECT>
      </TD><TD ALIGN=CENTER VALIGN=TOP>
        <FONT size=2 color=#000000>颜色:</FONT>
        <SELECT name="usercolor" id="msgcolor">
          <OPTION value="red" selected>红色</OPTION>
          <OPTION value="yellow">黄色</OPTION>
          <OPTION value="green">绿色</OPTION>
          <OPTION value="blue">蓝色</OPTION>
        </SELECT>
      </TD>
        <TD><input type="Button" name="Send" value="发送" onClick="updateChatMessage()">
      </TD></TR>
    </TABLE>
    服务器的聊天信息数:<SPAN id="CountMessages"></SPAN>
    </DIV>
    </BODY>
    </HTML>
    <!--第93~118行的表格就是输入聊天信息的窗体,当点击第116行的按纽后就可以执行updateChatMessage函数更新张贴的聊天信息-->


    4.GetChatXML.asp

    <!--HttpRequest对象发送目的地的ASP程序,这个程序在收到控制XML文件后,返回服务器端的信息内容-->

    <%
    '设定为XML文件
    Response.ContentType="text/xml"
    '设定不存储客户端缓存
    Response.Expires=0
    <!--第3行设定此份文件为XML文件,第5行设定文件内容并不会存储在客户端的缓存-->

    '获取客户端控制的XML DOM
    Set clientxmlDom=Server.CreateObject("MSXML2.DOMDocument.4.0")
    clientxmlDom.async="False"
    clientxmlDom.load(Request)
    <!--在第9行使用Request获取客户端发送来的XML DOM对象并且加载为clientxmlDom对象-->


    '获取Application变量的聊天信息XML文件
    strMessages=Application("ChatMessages")
    Set serverxmlDom=Server.CreateObject("MSXML2.DOMDocument.4.0")
    serverxmlDom.async="False"
    serverxmlDom.loadXML(strMessages)
    <!--在第11行获取Application变量的聊天信息strMessages,第14行加载成为serverxmlDom对象-->

    '建立响应的XML文件
    Response.Write("<?xml version='1.0' encoding='GB2312'?>")
    Response.Write("<chatroom>")
    <!--使用Response.Write建立响应的文件内容,第16行为XML文件声明,第17行为根标记<chatroom>-->

    '是否为第一次进入
    If clientxmlDom.documentElement.selectSingleNode("enter").text="true" Then
      '新增系统的欢迎信息
      strSystemMessage="<message>"
      strSystemMessage=strSystemMessage & "<text>欢迎["&Session("UserName")&"]进入聊天室</text>"
      strSystemMessage=strSystemMessage & "<user>系统管理者</user>"
      strSystemMessage=strSystemMessage & "<say>说</say>"
      strSystemMessage=strSystemMessage & "<color>white</color>"
      strSystemMessage=strSystemMessage & "</message>"
      '建立系统信息的XML DOM
      Set sysxmlDom=Server.CreateObject("MSXML2.DOMDocument.4.0")
      sysxmlDom.async="False"
      sysxmlDom.loadXML(strSystemMessage)
    <!--如果是刚刚进入聊天室,在第21~26行建立欢迎进入聊天室的系统信息,并且在第30行建立成为XML DOM对象-->

      '新增系统信息
      serverxmlDom.documentElement.appendChild(sysxmlDom.documentElement)
      Set sysxmlDom=Nothing
      '更新Application变量
      Application("ChatMessages")=serverxmlDom.xml
    <!--在第32行将系统信息新增到服务器的聊天信息,第35行更新服务器聊天信息的Application变量-->

      '获取所有的聊天信息
      Set objMessages=serverxmlDom.documentElement.selectNodes("message")
      intlastLine=objMessages.length '计算显示的信息条数
      If intlastLine < Application("FirstTimeMsgs") Then
        intlastLine=0
      Else
        intlastLine=intlastLine - Application("FirstTimeMsgs")
      End if
    <!--上述的第37行获取所有的聊天信息,第38行获取信息数,在第39~43的条件因为是刚刚进入的用户,只会显示Application变量FirstTimeMsgs条信息数,如果没有这么多信息就将在第40行显示所有的信息,第42行只显示FirstTimeMsgs条信息数-->

    Else
      '获取所有的聊天信息
      Set objMessages=serverxmlDom.documentElement.selectNodes("messages")
      '获取用户已获取的聊天信息数
      intlastLine=Session("ShowedLines")
      '是否有删除聊天信息
      If intlastLine > objMessages.length Then
        intlastLine = objMessages.length - 1
      End if
    End if
    <!--如果为已经在聊天室的用户,在第46行获取聊天信息后,第48行获取目前已经显示的聊天信息指针,第50~52行检查是否有删除聊天信息,此时需要修正信息的指针-->

    intPos=0
    '显示所有的信息
    For Each objNode in objMessages
      If intPos >=intlastLine Then
        Set objText=objNode.selectSingleNode("text")
        Set objUser=objNode.selectSingleNode("user")
        Set objSay=objNode.selectSingleNode("say")
        Set objColor=objNode.selectSingleNode("color")
        Response.Write("<message>")
        Response.Write("<text>" & objText.text & "</text>")
        Response.Write("<user>" & objUser.text & "</user>")
        Response.Write("<say>" & objSay.text & "</say>")
        Response.Write("<color>" & objColor.text & "</color>")
        Response.Write("</message>")
      End if
      intPos=intPos + 1
    Next
    <!--在第56~70行的For Each循环取出尚未显示的聊天信息,第57行检查是否还有尚未显示的聊天信息-->

    Session("ShowedLines")=objMessages.length
    Response.Write("</chatroom>")
    Set serverxmlDom=Nothing
    Set clientxmlDom=Nothing
    %>
    <!--最后在第71行记录目前显示的聊天信息数,第72行为结束的根标记</chatroom>,建立好XML文件响应的聊天信息-->


    5.UpdateChatXML.asp

    <!--当在聊天室输入聊天信息后,使用HttpRequest对象将张贴的信息送到UpdateChatXML.asp程序,然后将信息新增到Application变量-->

    <%
    '设定不存储客户端缓存
    Response.Expires=0
    <!--因为此网页响应的为文字内容,所以只在第3行设定网页不存储在客户端缓存-->

    '获取客户端的XML DOM
    Set clientxmlDom=Server.CreateObject("MSXML2.DOMDocument.4.0")
    clientxmlDom.async="False"
    clientxmlDom.load(request)
    <!--上述程序块获取客户端送来张贴信息的XML  DOM对象-->

    '获取聊天信息的XML文件
    strMessages=Application("ChatMessages")
    Set serverxmlDom=Server.CreateObject("MSXML2.DOMDocument.4.0")
    serverxmlDom.async="False"
    serverxmlDom.loadXML(strMessages)
    <!--上述程序块获取服务器端聊天信息的XML DOM对象-->

    '新增聊天信息
    serverxmlDom.documentElement.appendChild(clientxmlDom.documentElement)
    <!--将客户端送来的张贴信息新增到目前的XML DOM对象-->

    '删除过多的信息
    intCurrMessages=serverxmlDom.documentElement.childNodes.length
    intTotalMsgs=intCurrMessages
    '是否超过最大的信息数
    If intCurrMessages > Application("MaxMessages") Then
      '删除指定的信息数
      For intI=0 To Application("DelMessages")
        serverxmlDom.documentElement.removeChild(serverxmlDom.documentElement.firstChild)
        intTotalMsgs=intTotalMsgs - 1
      Next
    End if
    <!--上述程序块在检查聊天信息是否过多,在第16行获取目前的聊天信息数,第19行检查是否过多,如果是,在第21~24行的循环删除Application变量DelMessages的信息数-->

    '响应信息数的文字内容
    Response.Write(intTotalMsgs)
    '更新Application变量
    Application("ChatMessages")=serverxmlDom.xml
    %>
    <!--最后在第27行响应目前服务器端的信息数,第29行更新Application变量ChatMessages的聊天信息-->


       收藏   分享  
    顶(0)
      




    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/4/11 16:40:00
     
     losait 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(猛啃高等数学)
      文章:13
      积分:113
      门派:XML.ORG.CN
      注册:2005/4/14

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给losait发送一个短消息 把losait加入好友 查看losait的个人资料 搜索losait在『 XML源码及示例(仅原创和转载) 』的所有贴子 引用回复这个贴子 回复这个贴子 查看losait的博客2
    发贴心情 
    这个有什么问题吗,我试了一下,好像有点错误
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/4/16 11:34:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 XML源码及示例(仅原创和转载) 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2025/8/6 9:46:06

    本主题贴数2,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    109.375ms