昨天晚上回家在电车上, 想到你的另一个问题:
如果你的chat room里有20个人, server上岂不是同时有20个CGI占用资源不释放?
以后人越多你的server的性能就急剧下降.
我想了一个办法,感觉可行,但我现在忙着做BBS, 如果你有时间可以帮我试验一下:
1.首先,要明白一点,CGI/ISAPI用完后必须立即关闭, 所以不可能通过他来随时
添加内容;
2.该功能的关键不是CGI在"不停地添加内容", 而是当别人添加内容后,能及时通知
你刷新内容,这个是不可能的,在我看来只有通过timer定时查询新内容;
3.刷新你当前显示的内容会闪烁,而且如果网络速度慢,刷新一次很费劲, 那么,
我们可不可以在背景读取新内容,读完之后添加到前景的内容后面,以避免闪烁?
以一个标准的chat room为例, 窗口分成上下2个帧:
- 上面的帧用来显示谈话的内容,我们取名为frame_message,里面有一个TEXTAREA,
我们取名叫edit_message;
- 下面的帧用来和用户交互,取名为frame_input.
添加一个隐藏的frame,取名为frame_hidden,包含一个TEXTAREA,取名为
edit_hidden, 并添加一些javascript代码, 使该隐藏frame调入完毕之后
就将edit_hidden的内容添加到frame_message里面的edit_message后面.
(隐藏的frame可以通过将height=0得到)
现在我们在用来显示内容的frame_message里面添加一个表单:form_timer,该
表单没有任何其他的域,只是将edit_message这个TEXTAREA包括在里面,然后在
这个frame里面做一个定时器setTimer(5000),每5秒提交一次表单form_timer.
该表单的输出frame为那个隐藏frame: frame_hidden.
因为edit_message这个TEXTARA是属于该form的,所以它的内容被一起发送到server
端供CGI/ISAPI处理, CGI的工作就是将得到的文本和数据库比较(当然,如果你不通
过数据库管理,可以用一个文本文件), 找出新的记录, 然后将这些新的记录写回到
那个隐藏frame: frame_hidden 的TEXTAREA: edit_hidden.
CGI返回后,隐藏frame就被刷新, edit_hidden内容被更新(当然,你是看不到的,
因为它是隐藏的),然后javascript将edit_hidden的内容添加到frame_message
里面的TEXTAREA: edit_message后面, 注意,这个时候按理说也会有闪烁,但这是
在内存里面进行的,速度极快,你感觉不到的(最后可能需要把光标调到文本最后).
至于你自己的发言,首先要添加到message后面,然后也要记得传送到server,不然
别人看不见的.
=================
基本原理如此: 用一个隐藏的frame代替来接受刷新的数据, 接受后
用script把新内容添加到message后面,这样用户感觉不到刷新.
可能有不少问题, 实在没时间试验, 你可以测试一下.
说实话, 我还是觉得一个CGI做的chat room没必要做的那么好,再好也比不上
java applet做的.