数据库聊天室的“无刷新”技术要点

---摘自《CHINAASP》（文/IP浪子）
聊天室是网络实时交互的最常应用之一。聊天室的制作要解决好以下问题。
1、谁在发言 2、讲给谁听 3、讲些什么
与ICQ不同，ICQ 的数据流是一对一的关系。只要解决好上面三个问题就
可以实现。
聊天室由于存在一对多、多对一、一对一等多种数据关系，因此就有一个
数据的存放问题。
ASP 聊天室的数据存放一般有三种形式： 一是用全局变量Application 和
Session对象。这种形式速度快效果好，但系统资源消耗太大。二是应用读
写数据库实现。这种方法简明但服务器频繁读写数据据库很累。第三种可用
读写TXT文件完成。适合简单的聊天室。
三种方法都有一个共性的特点：客户端要获取新的聊天数据，必需刷新
调用。刷新时间过短，屏幕晃动厉害，刷新时间过长，等待时间太多感速度
太慢。于是人们分别用触发刷新与自动刷新结合从感觉上得到改善。二是利
用隐藏帧进行刷新再把内容加在显示帧上，形成所谓“无刷新”聊天室，解
决了屏幕晃动问题。
“无刷新”聊天室要解决的技术问题有：
一、如何判断新数据
二、新数据的提取
三、如何让客户断在有新数据时能及时更新
以上一、二用Application很容易实现，但第三个问题不容易解决。用数据
库做聊天室，第三个问题相对容易，但第一、二个问题要费点精神。笔者用
数据库做的聊天室采用了“无刷新”技术，没有用一个Application，主要
的技术要点是：
在数据库中另设置只有一个字段的表，字段名：BS
用户每次登陆读一次BS 的值。 设一个Session别作为每一个具体用户的
当前发言次数，初始为 BS-1。
用户每发言一次使 BS + 1（Session 值不此时不加，形成Session与BS差）
在隐性刷新帧上判断：
如果 BS 与 Session 有差，则读数据库将新数据读出并在显示帧显示。
Session+1 表示新数据已经读出，不再重读。
反复此过程，直到所有新数据据读出并显示。此时 BS = Session
上述方法解决了上面讲的 判断新数据和新数据的提取的问题。由于新数据
本身没有任何变化，依然原样存放在数据库中，客户端无论时间差多大，只
要自身的Session与BS有差，一当读库，差多少多多少条记录，解决了客户端
刷新差异带来的不显示问题。
以上方法，当然也可以用Application来设置 BS。还有一但BS 到了一定值
时（看同时发言人数而定），要重置为 1 。
以上方法在 IIS 4 平台，局域网、因特网通过。