cAKK请进来!(关于聊天室的一个想法)(50分)

  • 主题发起人 主题发起人 shopman
  • 开始时间 开始时间
S

shopman

Unregistered / Unconfirmed
GUEST, unregistred user!
目前聊天室都采用定时刷新,网页下载完后开始计时,那么我为什么要让浏览器
知道这一页已经下载完了呢。
我不知道浏览器以什么标志来确认网页已经下载完了,如果去掉这个标志浏览器
就认为这一页还没有下载完处在接收状态,这时CGI程序对这个网页进行操作那
么所有的用户不就都能实时的看见了吗?
这样作能避免浏览器弹出超时错误吗?
 
如果你的CGI程序一直霸占着那个HTML, 浏览器会发生超时错误.

而且你的这个想法还有很多错误,待我慢慢想想.

我也对这个问题很感兴趣,不过评我的直觉,CGI/ISAPI不可能做到这一步.
真正能够实现的恐怕只有Java Applet,网上有很多免费的Java Chat程序,
当然这是题外话了.

请保留这个问题一段时间,我最近也正在做一个BBS+ChatRoom. :-)

 
why not a vbscript/jscript?
just 关注:-)
 
昨天晚上回家在电车上, 想到你的另一个问题:
如果你的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做的.
 
cAKK兄我还是觉得我的想法是可行的。

如您所言标准的chat room, 窗口分成上下2个帧,上面的帧是发言(就命名为A)下
面的帧是用户交互区(命名为B),我的想法核心是A帧采用一种办法使浏览器始终
对A帧处在下载状态在这种环境下chat room中任何一个成员发言也就是他在执行
这个CGI,这时CGI就把发言内容加在A帧中这样chat room中所有成员都能看见。
CGI并不需要持续占用A帧只有当用户发言是才改动它。


第二,
你我的想法看能不能结合起来,frame_message中的定时刷新去掉把frame_hidden
改成对谈话内容处在持续下载状态这时chat room中20位成员无论那一位发言
frame_input把内容传给CGI之后CGI的作用只是把chat肉容加在谈话内容后就完成
工作,因为frame_hidden是对谈话内容处在持续下载状态,所以发言内容能实时返
回frame_hidden再由java处理返到frame_message。


第三,
因为我玩不转java所以在写这个聊天室时只能用delphi,这两天我想来想去如果在
浏览器这边能运行个什么的与服务器端配合起来问题会简单得多,光是CGI剃头挑子
一头热不会有好东西出来。因此咱们也得两手一起抓,CGI、JAVA两不放嘛。
 
>>我的想法核心是A帧采用一种办法使浏览器始终对A帧处在下载状态
我觉得这是不可能的. http协议不支持这个想法,它不能保持一个持续
的连接.

这个问题的关键在:
当别的用户更新发言后,可以通过自己的CGI保存数据,保存完后, CGI
怎样通知到"每个在chat room中的人"?
CGI是被动执行的,就是说调用他才执行,所以他不能主动去通知别人.
那么只有在浏览器上面有一个什么东西一直是激活的,保持和server
的联系,他才能及时得到别人的更新消息.
而目前浏览器的东西,严格的说都是"死"的, 就算是ASP, CGI等可以
动态生成页面, 但一旦生成之后也就是一个"死"的页面了,和server
不再有任何联系.

能够在页面上保持"激活"状态的,只有java applet.
 
cAKK兄说来说去还是得用到java applet。
如果有这样一个java applet在客户端处在激活状态与服务端保持联系,如有用户发
言这个java applet取回发言内容再放回发言帧这样所有在线用户都能看见了。
而CGI只是处理发言内容不再考虑返回内容的问题。
那么java applet这个玩意该如何写呢? 网上那里能找到。

别外你的隐藏帧想法很棒,java applet把内容返回到隐藏帧之后由你前次提到的那
个java applet再把内容追加到frame_message这样即保证成员发言的实时返回又能
不闪烁的追加到frame_message,good! very good!
 
对,如果java applet能够和html通讯,就能解决大问题.这个我还不太清楚.
应该时可以的.

另外,关于刷新的问题,我又想到一个更简单的办法,连隐藏帧也不要,
CGI返回新的发言内容,不要直接返回,而是这样:
比如需要添加的内容是:"cAkk:你好!",那么传统上是这样写返回语句:
response.content:='cAkk:你好!'; 在这里我们说的是返回到隐藏帧,
然后由一个javascript写到frame_message里面.

那么为什么不直接写到frame_message里面呢? 这样写:
response.content:='Javascript:frame_message.document.writeln("cAkk:你好!");';
这样的结果仅仅是执行这个script语句,不会让frame_message刷新的.

当然,具体的语句不一定是document.writeln,我只是句一个例子,而且肯定有效.

BTW:一件很巧的事,www.chinasp.com你知道吧? 在joy asp版里的那个
水平最好的batman, 几乎在我前面关于"隐藏帧"想法的同时,也突然想到
了这个点子.我是看他给别人的发言时发现的,真巧.
 
cAKK兄现在只有这个java applet的问题了,我是写不出的只有在网上找有结果我通
知你。
 
接受答案了.
 

Similar threads

D
回复
0
查看
930
DelphiTeacher的专栏
D
D
回复
0
查看
871
DelphiTeacher的专栏
D
D
回复
0
查看
945
DelphiTeacher的专栏
D
D
回复
0
查看
777
DelphiTeacher的专栏
D
后退
顶部