早闲来无事,我也说说编写不刷屏的聊天室。
首先要说,编写真正好的聊天室已经超出了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了。错误之处请高手纠正,共同进步。