聊天室自做 Follow Me(转)

聊天室

上网而没去过聊天室的人,可谓是凤毛麟角,下面,我们就自己来做个最简单的聊天室。
  目前聊天室显示对话的方式一般有两种。一是每隔 x 秒就把整个对话显示区刷新一遍,此方的弊端显而易见:数据传输量大且屏幕有闪烁感;其二是有新的发言时,才将该内容传递给客户端,并添加在原有对话的尾部,此法数据传输量就比较小且屏幕是平滑滚动,视觉效果好。第一种方法的实现已经有很多资料介绍,因此本文将介绍第二种刷新方式。
  设计思路:
  ⑴服务器端只保留最新的30条发言作为缓冲区,新的发言内容将最旧的发言挤出。
  ⑵每句发言都分配一个递增的序号。客户端最后出现的发言的序号记录在 Session 中。
  ⑶利用隐藏框架进行刷新,刷新时,将 Session 值与缓冲区的每句发言的序号进行比较,如果序号大于 Session 值说明该发言是新的,就将该发言的数据取出,并将该发言的序号值赋给 Session。
  ⑷对话显示区使用 document.open() 打开后,就不再关闭,当隐藏框架刷新时有新数据取出并传到客户端时,将这些原始数据格式化为要显示的内容(此工作可以在服务器端执行,但为减轻服务器的负担,就将对话的合成工作移交给客户),然后调用 document.writeln 方法将发言的内容写到对话显示区的尾部。
  ⑸在对话显示区中放置一段自动滚屏的代码,使屏幕自动向下滚动,并可通过发言区的复选框来选择是否自动滚屏。
  实现方法:
  一、本程序只需要 4 个文件即可实现:
  ⑴chat.asp:聊天室框架文件,负责初始化程序运行环境并随机分配四位数的数字做为用户名,再把页面从上到下分成四部分,顶、底两个框架高度为 0。
  ⑵chatfyq.htm:发言区,提供输入姓名、发言的文本框,及一个发言按钮和一个自动滚屏的开关(复选框),并定义在客户端执行的 JavaScript:checksays()(对发言进行有效性检测)、cls()(清空对话显示区的内容)、write()(初始化对话显示区,定义页面颜色、文字大小,并放置滚屏代码)、sw(username)(在对话区点击人名时,将人名写到发言框中)、w(un,sa,tn,dt)(将原始数据合成为完整的发言内容,并添加到对话显示区的尾部)。
  ⑶chatt.asp:此文件位于顶部的隐藏框架(高度为 0)中定时刷新,把新的发言的原始数据使用 <script Language=JavaScript>parent.f2.w("姓名","发言内容","原始姓名","发言时间")</script> 的格式输出到客户端,即可调用 chatfyq.htm 中定义的 w(un,sa,tn,dt) 函数来显示出发言内容。
  ⑷chatsay.asp:发言提交到此文件进行处理。此文件位于底部的隐藏框架中。将发言加入缓冲区后,立即执行和 chatt.asp 相同的代码段,将发言显示出来。(chatsay.asp 后面的代码和 chatt.asp 是相同的,之所以不在 chatsay.asp 后面使用 Response.Redirect "chatt.asp" 来调用,是为了加快速度,因为重定向方式需要建立两次连接:发言提交是连接一次,重定向时又要再连接一次,效率低。)
  二、部分关键代码注释:
  ⑴初始化代码段:Application("chat_hh") 缓冲区中最后一句发言的序号、Session("chat_hh") 就是“设计思路⑶”中提到的 Session 值,用于记录客户端已显示的最后一句发言的序号:

'如果该序号为空,表明程序未初始化
If Application("chat_hh") = "" Then
  '定义缓冲区数组,共 30 句发言
  '每句发言占用 5 个位置:序号、姓名、发言内容、原始姓名、发言时间
  Dim sd(150)
  Application.Lock
  '将数组赋值给 Application("chat_sd"),即:发言只保留在服务器内存中
  Application("chat_sd") = sd
  '定义初始序号为 0
  Application("chat_hh") = 0
  Application.UnLock
End If
'为避免序号过大,每当序号增大到 65535 时就将序号复位为 0
If Application("chat_hh") > 65535 Then
  Application.Lock
  Application("chat_hh") = 0
  Application.UnLock
End If
'客户端用来记录已经显示到哪句发言的 Session("chat_hh")
'其值等于序号减去 12,即:新来的用户可以看到原有的 12 句发言
Session("chat_hh") = Application("chat_hh") - 12

  ⑵chatfyq.htm 中的 JavaScript 函数:write():

function write(){
  //使用 document.open() 打开对话显示区,打开后不关闭,这样就可以不断向里面添加新内容
  parent.f1.document.open();
  //向对话显示区中写入 HTML 文件头
  parent.f1.document.writeln("<html><head><title>对话区</title><meta http-equiv=Content-Type content=\"text/html; charset=gb2312\">");
  //写入样式表定义
  parent.f1.document.writeln("<style type=text/css>.t{color:AAAAAA;font-size:9pt;}body{font-family:\"宋体\";font-size:10.5pt;line-height:160%}A{text-decoration:none}A:Hover{text-decoration:underline}A:visited{color:blue}</style></head><\Script Language=\"JavaScript1.1\">");
  //写入自动滚屏代码
  //......(注意:此处省略的代码请参见完整的源程序)
  parent.f1.document.writeln("StartUp();</\script>");
  parent.f1.document.writeln("<body bgcolor=CDE0FC text=000000>");
  parent.f1.document.writeln("<hr size=1>【欢迎光临】红蜻蜓聊天室恭候您的光临。<hr size=1>");
  //将 chatt.asp 载入框架顶端的隐藏框架中,执行定时刷新功能
  parent.t.location.href="chatt.asp";
}

  ⑶chatt.asp 定时刷新,并取得最新的发言的代码:

'将聊天室的对话内容的缓存取到 sd 数组中
sd = Application("chat_sd")
'取得最后显示的发言的序号
userhh = Session("chat_hh")
'定义 show 数组,用于存放要显示的发言内容
Dim show()
ReDim Preserve show(0)
j = 1
newuserhh = 0
'遍历缓冲区的发言内容
For i = 1 To 150 Step 5
  newuserhh = sd(i)
  '如果 sd(i)(每句发言的序号)大于用户端最后发言的序号且发言存在就将其存入 show 数组
  If sd(i) > userhh And sd(i) > 0 Then
    ReDim Preserve show(j), show(j + 1), show(j + 2), show(j + 3)
    show(j) = sd(i + 1)
    show(j + 1) = sd(i + 2)
    show(j + 2) = sd(i + 3)
    show(j + 3) = sd(i + 4)
    j = j + 4
  End If
Next
'输出 javascript 到客户端
Response.Write "<script Language=Ja

时间: 2024-09-22 18:01:28

聊天室自做 Follow Me(转)的相关文章

聊天室自做 Follow Me

聊天室 上网而没去过聊天室的人,可谓是凤毛麟角,下面,我们就自己来做个最简单的聊天室. 目前聊天室显示对话的方式一般有两种.一是每隔 x 秒就把整个对话显示区刷新一遍,此方的弊端显而易见:数据传输量大且屏幕有闪烁感:其二是有新的发言时,才将该内容传递给客户端,并添加在原有对话的尾部,此法数据传输量就比较小且屏幕是平滑滚动,视觉效果好.第一种方法的实现已经有很多资料介绍,因此本文将介绍第二种刷新方式. 设计思路: ⑴服务器端只保留最新的30条发言作为缓冲区,新的发言内容将最旧的发言挤出. ⑵每句发

请问web的聊天室能做吗?能做的话怎么做?

问题描述 创建聊天室之后, 是通过rest api中的发送消息接口来发送消息到聊天室吗?  在 rest api中也没看到加入聊天室的接口,也不知道如何监听其他用户在聊天室发送的消息 .  难道是web-im不能做聊天室的功能吗? 求攻城狮指教!!! 解决方案 webim不支持聊天室,webim支持群组,可以调用rest接口实现

聊天室实现私聊(一)

聊天室 几个要好的网友在聊天室里闲聊的时侯,总会遇上有些话题是不想同一聊天室内别的聊友看见的,那么聊天室支持悄悄话功能将是什分有必要的了,实现悄悄话的方法很多,现在小虎介绍一下利用session对象来实现它,用session对象来实现悄悄话,是有优缺点的,因为session对象的应用,其实就是客户端cookies的使用.如果客户端cookies不支持或关闭了,那么程序运行起来就有问题了.那么使用session对象就没好处了吗??非也,至少在编程上大大减少了工作量嘛,试想一下如果需要保存该用户的聊

兼容Chrome和IE的ajax轻量级PHP聊天室实现

兼容Chrome和IE的ajax轻量级PHP聊天室实现 做了一个QQ聊天交友网站,想加个聊天的功能,于是做完用PHP做了简单又强大的聊天室 1. 创建mysql数据库表:create table chat( id bigint AUTO_INCREMENT,username varchar(20), chatdate datetime,msg varchar(500), primary key(id)); 2.编写建议连接数据库函数: dbconnect.php <?php function d

聊天室实现私聊第1/4页

几个要好的网友在聊天室里闲聊的时侯,总会遇上有些话题是不想同一聊天室内别的聊友看见的,那么聊天室支持悄悄话功能将是什分有必要的了,实现悄悄话的方法很多,现在小虎介绍一下利用session对象来实现它,用session对象来实现悄悄话,是有优缺点的,因为session对象的应用,其实就是客户端cookies的使用.如果客户端cookies不支持或关闭了,那么程序运行起来就有问题了.那么使用session对象就没好处了吗??非也,至少在编程上大大减少了工作量嘛,试想一下如果需要保存该用户的聊天名字,

用ASP做个简单聊天室

聊天|聊天室 这次我为大家介绍的是我第一个用ASP做的程序----聊天室,很简单,没用数据库,但是对于还未学到ADO的同志是个比较好的参考例子,这个例子基本包括了所以ASP的五个内置对象,但是有了聊天室的雏形,如果水平到家可以在此基础上做的强大好看点好了,废话不说了,现在进入正题吧! 首先这个程序有四个部分组成,分别是index.asp,chat.asp,show.asp,input.asp首先调用chat.asp然后就可以运行了! 作为一个初学者,我觉得写一个程序整体观念很重要,也就是说你首先

fms-使用flash和FMS做语音聊天室怎样不播放自己的声音

问题描述 使用flash和FMS做语音聊天室怎样不播放自己的声音 使用NetStream流发布实时语音到服务器nsOut.publish("dummy", "live"); 然后客户端使用另一个NetStream播放nsIn.play("dummy"); 现在问题是自己说的话也被自己播放出来了这个该怎么解决,或者说做语音聊天室不是用这个方法做的 还求各位大大给个思路

求做聊天室程序!

问题描述 主界面已经做好,求高手做一个聊天室程序.需求:可以更换头像.只要求文字聊天,私聊.公聊.高手加我QQ86129789高手有酬劳 解决方案 解决方案二:帮顶解决方案三:...解决方案四:http://www.codepub.com/software/view-software-14676.html代码还是要自己写的,像你说的"更换头像"其实就是图片上传的问题...还是自己慢慢琢磨吧....解决方案五:我这有Java版本的QQ 楼主要不解决方案六:的马士兵的在线聊天

.net做的B/S结构的聊天室

问题描述 谁有.net做的B/S结构的聊天室,谢谢了 解决方案 解决方案二:网上多的是,baidu一下会很多,www.codeproject上也有下.解决方案三:zlchat是一个网页视频会议软件,使用它你可以与远方的亲朋好友视频聊天,也可以用于公司远程视频会议,远程视频教学.zlchat没有使用任何activex插件,不用安装客户端,打开网页就可能使用.1.不限制房间,用户数2.每个房间最高可达50人,一台服务器最高可支持1000人同时在线3.普通ADSL可以同时看10路用户视频4.费版本永远