精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>● CGI>>实例分析>>不刷新的聊天室 <转〉

主题:不刷新的聊天室 <转〉
发信人: tanshuai()
整理人: workingnow(2002-10-30 13:51:57), 站内信件
今早闲来无事,我也说说编写不刷屏的聊天室。 
首先要说,编写真正好的聊天室已经超出了CGI的范畴,要求不仅对语言而且 
对操作系统和网络协议有一定的了解,需要一些经验的积累。 
简单的说就是编写端口守护程序,这里牵扯到socket编程,进程间交互,(二 


者都是比较古老的技术),以及HTTP协议。前面“天水“同志已经贴出了这部分

 

的C代码,我只是稍做解释。聊博高手一哂。 
1.socket编程,利用UNIX的socket抽象概念打开服务器的一个面向连结的端口,

 

等待外部的联接请求。perl语言使用名空间IO::Socket::INET,在新版本的perl 



中我推荐使用HTTP::Daemon配合HTTP::Request(可以简化HTTP处理过程)。 
2.进程间交互,这是实现不刷屏的关键所在,socket连结后通常利用子进程 
完成与用户的具体交互工作(当client存在,子进程一直与其保持连结,不首先

 

关闭连结),而父进程返回等待其他连结请求。 父进程与 
子进程间的交互工作通常用管道pipe()来完成,这里使用单工管道即可,即 
父-〉子。工作是这样的:当有内容提交,父进程将它通过管道传递给所有存在 



的子进程(通常保存在hash中),然后子进程分别发给各自的client.看起来不 



难。 
值得注意的问题: 
一是判断用户client是否关闭连结。 
二是子进程退出后,捕捉$SIG{CHLD}信号。 
这两点很重要,开放过多的进程,管道和将大量的信号全都仍给操作系统, 
它还受得了么?保存管道的hash也不能越来越大吧? 
3.HTTP协议,就是分析用户的HTTP请求,并且返回HTTP应答。首先看看请求是 


什么方式,get还是post,当然还有一些不常用的。get处理起来比较简单,post

 

要通过head的信息read()body,网上对HTTP具体结构的阐述很多,我就不多说了。

 

值得注意的问题: 
一个是换行符问题,新手就把它都当作\012\015即可。 
另一个是HTTP1.1同老板本在处理post时不太一样。 
掌握了以上内容,可以尝试编写一个简单的HTTP server,会很有满足感的^_^ 


perl继承了大量的c的*.h,编写上述问题完全可以胜任,细节都和c很相似, 
请关注perl朋友,对它有充分的信心! 
上面说的前两点都是跟操作系统相关的,NT还不行,我在activeperl5.6上 
试过,并不像传说的,有很多问题。不修改代码直接在NT上使用我们只能期 
待更完善的activeperl了。 
错误之处请高手纠正,共同进步。 



--
CGI版主(BM) ——  ☆★天水★☆ №↑1.
☆网络世界,你我共行,创出新意,创出未来,创出新世界!★
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
□E-Mail: [email protected] 【Http://ts.cncenter.com】
〓I Seek You!ICQ UIN : 25856530 (AOL) OICQ ID:66552
'''''''''''''''''''''''''''''''''''''''''''''''''''''

※ 修改:.tanshuai 于 May  8 19:19:32 修改本文.[FROM: 202.96.86.38]
※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.96.86.38]

[关闭][返回]