ºìÁªLinuxÃÅ»§
Linux°ïÖú

ÔÚLinuxϵͳÏÂʵÏÖServer Push

·¢²¼Ê±¼ä:2006-02-09 09:36:37À´Ô´:ºìÁª×÷Õß:wide
ÓÉÓÚLinuxµÄ¿ª·ÅÐÔ£¬¼«´ó¼¤·¢Á˳ÌÐòÔ±µÄ´´ÔìÁ¦£¬Ê¹µÃÒÔLinuxΪ×÷ҵƽ̨µÄм¼Êõ²»¶Ï³öÏÖ¡£Server Push(ÍƼ¼Êõ)¾ÍÊÇÆäÖÐÒ»Àý¡£Ëü¿ÉÔÚÍêÈ«²»Ôö¼Ó³É±¾µÄ»ù´¡ÉÏ£¬Ê¹ÍøÕ¾´ïµ½×î¼ÑµÄÐÔÄÜ¡£±¾ÎĽ«¶ÔÆä½øÐÐÏêϸ½éÉÜ¡£

¡¡¡¡ Ò»¡¢»·¾³ÅäÖÃ

¡¡¡¡ ΪÁËÔÚLinuxϸü³ä·ÖÁìÂÔServer PushµÄ¹¦ÄÜ£¬ÔÚÔËÐл·¾³ÉÏ£¬ÎÒÃÇÐè½øÐÐһЩѡÔñ¡£

¡¡¡¡ 1.WWW·þÎñÆ÷

¡¡¡¡ Ê×ÏÈÒªÔÚLinuxÉÏ°²×°Apache£¬ÒÔ±ãÄÜ×ÔÓɱàÒ빦ÄÜÄ£¿é£¬ÕâÑù¿ÉÒÔ³ä·ÖʹÓÃServer Push¡¢FastCGI¡¢EPerlºÍPHPµÈеÄÀ©Õ¹¹¦ÄÜ¡£

¡¡¡¡ 2.½Å±¾Ö§³Ö

¡¡¡¡ ±ÊÕßÍƼöÓÃPerl»òCÓïÑÔÀ´Ð´CGI½Å±¾£¬ÒòΪPerlÒѾ­ÊÇCGI½Å±¾³ÌÐòÊÂʵÉϵıê×¼¡£¶øÇÒÔÚPerl 5ÖÐÒѾ­¿ÉÒÔÖ±½Óµ÷Óà C×Ó³ÌÐò¶ø²»ÐèÒªÈκÎÉùÃ÷¡£²»¹ÜÄãÓÃʲôÓïÑÔÀ´Ð´CGI½Å±¾£¬½âÊÍÆ÷ÖÐÓ¦¸ÃÓÐCGI.PMÄ£¿é£¬±ÊÕßÊÔÓõİ汾ÊÇ 5.004£¬Õâһģ¿éµÄ¸üаæ´ó¼Ò¿ÉÒÔ´ÓÍøÉÏÏÂÔØ¡£

¡¡¡¡ ¶þ¡¢³ÌÐòʵÀý¼°º¯ÊýÆÊÎö

¡¡¡¡ ºÃÁË£¬ÓÐÁËÉÏÃæµÄ¹¤¾ß£¬ÏÂÃæÎÒÃǾÍÀ´Ð´Ò»¸öServer Push³ÌÐòÀ´ËµÃ÷ËüµÄʵÏÖ¹ý³Ì£º

¡¡¡¡
ÒýÓÃ:
££!/usr/bin/perl

¡¡¡¡ use CGI qw/:push £­nph/;

¡¡¡¡ ¡ç| = 1;

¡¡¡¡ print multipart--init(£­boundary=¡µ¡ä£­£­boundary¡ä);

¡¡¡¡ while (1) {

¡¡¡¡ print multipart--start(£­type=¡µ¡ätext/plain¡ä),

¡¡¡¡ ¡åThe current time is ¡å,scalar(localtime),¡å\n¡å,

¡¡¡¡ multipart--end;

¡¡¡¡ sleep 1;

¡¡¡¡ }


¡¡¡¡ ³ÌÐòµÚ¶þÐиæËßCGI½âÊͳÌÐòÀ´µ÷ÓÃÖ§³ÖServer Push µÄ¹¦ÄÜÄ£¿é(CGI.PM)£¬ÔÚÕâ¸öÄ£¿éÖÐÔ¤Ïȶ¨ÒåÁËÈý¸öº¯Êý£ºmultipart--init()¡¢multipart--start()ºÍmultipart--end£¬Ö»ÒªÔÚ³ÌÐòÖÐÓÐuse CGI qw/:push £­nph/ÉùÃ÷£¬¾Í¿ÉÒÔÖ±½ÓʹÓÃÕâÈý¸öº¯Êý¡£

¡¡¡¡ multipart--init()º¯ÊýµÄ×÷ÓÃÊÇÉùÃ÷Ò»¸öÎĵµÀàÐÍ£¬¾ÍÏñÆÕͨµÄCGI³ÌÐòÖеġ°Content£­Type: text/html¡±ÉùÃ÷£¬¸æËß·þÎñÆ÷ÏÂÃæ´«Ë͵ÄÊÇHTMLÎĵµ£¬¶ømultipart--init()ÕâÒ»º¯ÊýÉùÃ÷µÄÎļþÀàÐÍÈ´ÊÇʵÏÖServer Push×î¸ù±¾µÄ·½·¨ÀàÐÍ£º

¡¡¡¡ Content£­Type: multipart/x£­mixed£­replace; boundary=¡ä£­£­boundary¡ä

¡¡¡¡ Èç¹ûÄã¶ÔHTTPµÄMIMEÀàÐÍÓÐÏêϸµÄÁ˽⣬Äã¾ÍÖªµÀmultipart ÀàÐÍÊÇÒ»ÖÖ¸´ºÏÀàÐÍ£¬ËüµÄ×ÓÀàÐÍÊÇmixed£¬×ÓÀàÐ͵ÄX²ÎÊý£¬´ó¼Ò¿ÉÒԲο´ÏêϸµÄMIMEÀàÐÍ˵Ã÷£¬ÕâÀï×î¹Ø¼üµÄÊÇreplace·½·¨£¬Ëü²»Í£µØÓÃнÓÊÕµÄÊý¾Ý¸üоɵÄÊý¾Ý£¬Õâ¾ÍÊÇ Server Push×î´óµÄ¼¼ÊõÄÚº­¡£boundaryÖ»ÊÇÒ»¸ö±ß½çÖµ£¬¸æËßä¯ÀÀÆ÷´ÓÕâ¶ù¿ªÊ¼£¬Ê¹ÓÃServer Push·½·¨ÁË¡£ÆäʵÄãÍêÈ«¿ÉÒÔÕâÑùÀí½â£¬Ö»ÒªÔڽű¾³ÌÐòÖÐÉùÃ÷ÁËÈçmultipart/x£­mixed£­replace ÕâÑùÒ»¸öÎĵµÀàÐÍ£¬·þÎñÆ÷¾ÍºÍ¿Í»§»ú½¨Á¢ÁËÒ»¸öÌرðµÄÁ¬½Ó¡£·þÎñÆ÷¾Í²»¶ÏµØ°Ñ¿Í»§»úÇëÇóµÄÊý¾ÝÔ´Ô´²»¶ÏµØÍÆÏòÁË¿Í»§»ú¡£¶ø´«Í³µÄ Client PULL·½·¨ÔòÊÇ£º

¡¡¡¡ 1.Client ºÍServer½¨Á¢Á¬½Ó

¡¡¡¡ 2.Client·¢ËÍÇëÇóµ½Server

¡¡¡¡ 3.ServerÏìÓ¦ÇëÇó

¡¡¡¡ 4.Server ¶Ï¿ªÁ¬½ÓÒÔÏìÓ¦ÏÂÒ»ÇëÇó¡£

¡¡¡¡ ͨ¹ýÕâÁ½ÖÖ·½·¨µÄ±È½Ï£¬´ó¼Ò¿ÉÒÔ¿´³öServer PushÓŵãÖ÷ÒªÔÚÓÚ·þÎñÆ÷ºÍ¿Í»§»úÖ®¼äÕâÖÖ²»¼ä¶ÏµÄÁ¬½Ó·½Ê½£¬Ê¹Ëü²»ÐèÒª²ÉÓÃClient PULLµÄ¡´META http£­equiv=refresh content=¡ån¡å¡µÕâÖÖ·½·¨À´Ë¢ÐÂÒ³Ã棬²»½ö¸üÐÂËٶȿ죬¶øÇÒ²»»á²úÉúÉÁ¶¯Ð§¹û¡£

¡¡¡¡ Èç¹ûÄã²»ÓÃmultipart--init()¶øÖ±½ÓÔڽű¾³ÌÐòÖÐÓÃÒÔÏÂÓï¾äÒ²¿ÉÒԴﵽͬÑùÄ¿µÄ£ºprint ¡åContent£­Type: multipart/x£­mixed£­replace; boundary=¡äboundary¡ä\n\n¡å¡£µ±ÏµÍ³²»Ö§³Ömultipart--init()º¯Êýʱ£¬¾Í¿ÉÒÔÖ±½ÓÕâÑùÉùÃ÷¡£

¡¡¡¡ multipart--start() Õâ¸öº¯ÊýÊÇΪ·þÎñÆ÷Ö¸¶¨ÁË´«ËÍÒ»¸öÈ·¶¨µÄÎĵµ£¬Èç¹û²»ÓÃÕâ¸öº¯Êý£¬¸ù¾Ý½Å±¾³ÌÐòµÄÄÚÈÝ·þÎñÆ÷¿ÉÒÔÖ±½Ó°ÑÖ¸¶¨Êý¾Ý´«Ë͸ø¿Í»§»ú£¬µ±È»¿Í»§»ú²»ÄÜʶ±ðÕâÖÖÀàÐ͵ÄÎĵµ¿ÉÒÔºöÂÔ¶ø²»»á²úÉú´íÎó¡£µ«Èç¹ûÄãÖ¸Ã÷Á˾ßÌåµÄÎĵµÀàÐÍ£¬ÈçÀý³ÌÖеÄtext/plain(´¿Îı¾ÀàÐÍ)£¬¿Í»§»ú¾Í²»ÔÙ¶ÔÎĵµ¼ÓÒÔ·ÖÎö£¬´Ó¶øÌá¸ßÁË´¦ÀíËٶȣ¬·ñÔò¿Í»§»úÖ»ÖªµÀ´«Ë͹ýÀ´µÄÊÇ multipart(¸´ºÏÐÍ)¶øÒªÖØжÔÆä·ÖÎö¡£¡¡¡¡

¡¡¡¡ ÖÁÓÚmultipart--endº¯Êý²»Ðè×÷Ïêϸ˵Ã÷£¬Ö»ÊÇ˵Ã÷ÁËÒ»¸ö Push¹ý³ÌµÄ½áÊø¡£¡¡¡¡

¡¡¡¡ ΪÁËʹ´ó¼ÒÄܸüºÃµØÀí½âÕâÈý¸öº¯ÊýÏêϸµÄ¼¼ÊõÄÚÈÝ£¬±ÊÕß°ÑÕâÈý¸öº¯ÊýµÄʵÏÖ¹ý³Ì½éÉܸø´ó¼Ò£º

¡¡¡¡
ÒýÓÃ:
sub multipart--init {

¡¡¡¡ my(¡çself,@p) = self--or--default(@--);

¡¡¡¡ my(¡çboundary,@other) = ¡çself£­¡µrearrange([BOUNDARY],@p);

¡¡¡¡ ¡çboundary = ¡çboundary || ¡ä£­£­£­£­£­£­£­ =--aaaaaaaaaa0¡ä;

¡¡¡¡ ¡çself£­¡µ{¡äseparator¡ä} = ¡å\n£­£­¡çboundary\n¡å;

¡¡¡¡ ¡çtype = Server--Push(¡çboundary);

¡¡¡¡ return ¡çself£­¡µheader(

¡¡¡¡ £­nph =¡µ 1,

¡¡¡¡ £­type =¡µ ¡çtype,

¡¡¡¡ (map { split ¡å=¡å, ¡ç--, 2 } @other),

¡¡¡¡ ) . ¡çself£­¡µmultipart--end;

¡¡¡¡ }

¡¡¡¡ sub multipart--start {

¡¡¡¡ my(¡çself,@p) = self--or--default(@--);

¡¡¡¡ my(¡çtype,@other) = ¡çself£­¡µrearrange([TYPE],@p);

¡¡¡¡ ¡çtype = ¡çtype || ¡ätext/html¡ä;

¡¡¡¡ return ¡çself£­¡µheader(

¡¡¡¡ £­type =¡µ ¡çtype,

¡¡¡¡ (map { split ¡å=¡å, ¡ç--, 2 } @other),

¡¡¡¡ );

¡¡¡¡ }

¡¡¡¡ sub multipart--end {

¡¡¡¡ my(¡çself,@p) = self--or--default(@--);

¡¡¡¡ return ¡çself£­¡µ{¡äseparator¡ä};

¡¡¡¡ }


¡¡¡¡ Èý¡¢Ó¦Óü¼ÇÉ

¡¡¡¡ ʹÓÃServer PushµÄÆäËü¼¼ÇÉ£¬ÏÞÓÚƪ·ù£¬±ÊÕß²»ÔÙ×÷¹ý¶àµÄ½éÉÜ¡£²»¹ýÓÐʱÓÉÓÚ¿Í»§»úÔÚÒ»¶Îʱ¼äÄÚûÓжԷþÎñÆ÷·¢ÉúÇëÇó£¬Ò²¾ÍÊÇÈôÒ»¶Îʱ¼äÄÚûÓÐеÄÄÚÈÝÏòä¯ÀÀÆ÷ÊäÈ룬¿ÉÄÜ·¢ÉúÁ¬½Ó³¬Ê±ÏÖÏó£¬ÓÃÏÂÃæµÄ³ÌÐòÀ´´¦ÀíһϾÍÄܺܺõؽâ¾ö£º

¡¡¡¡
ÒýÓÃ:
¡çmessage=1;

¡¡¡¡ ¡çwhilecount=1;

¡¡¡¡ do {

¡¡¡¡¡¡¡¡ Ö÷³ÌÐò;

¡¡¡¡¡¡¡¡ ¡çmessage£«£«;

¡¡¡¡¡¡¡¡ }

¡¡¡¡ if (¡çwhilecount == 30)

¡¡¡¡ {

¡¡¡¡ print ¡å¡´SCRIPT¡µ¡çmessage¡´/SCRIPT¡µ\015\012¡å;

¡¡¡¡ ¡çwhilecount = 0;

¡¡¡¡ }

¡¡¡¡ ¡çwhilecount£«£«;

¡¡¡¡ sleep 1;


¡¡¡¡ ÕâÖÖ¼¼ÇÉ´ó¼ÒÒ»¿´¾ÍÃ÷°×ÁË£¬ÕýÈçºÜ¶à FTPÈí¼þµÄLoopÒ»Ñù£¬ÔÚ¿ÕÏÐʱ·¢Ò»¸ö¿ÕÐźţ¬²»ÈóÌÐò½øÈëµÈ´ý״̬¡£Õâ¶Î³ÌÐòÿ¹ý30Ãë¾Í¸ø¿Í»§»úÊä³öÒ»ÐС´SCRIPT¡µ¡çmessage¡´/SCRIPT¡µ£¬¶ø¡çmessageÊÇÊýÖµ1¡¢2¡¢3µÈ£¬ÕâÒ»ÐÐÔÚä¯ÀÀÆ÷ä¯ÀÀʱ²¢²»ÏÔʾÈκÎÄÚÈÝ£¬ÈÃä¯ÀÀÕ߸оõ²»µ½¡£
ÎÄÕÂÆÀÂÛ

¹²ÓÐ 0 ÌõÆÀÂÛ