¡¡¡¡ Ò»¡¢»·¾³ÅäÖÃ
¡¡¡¡ ΪÁËÔÚ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µÈ£¬ÕâÒ»ÐÐÔÚä¯ÀÀÆ÷ä¯ÀÀʱ²¢²»ÏÔʾÈκÎÄÚÈÝ£¬ÈÃä¯ÀÀÕ߸оõ²»µ½¡£