• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            牽著老婆滿街逛

            嚴(yán)以律己,寬以待人. 三思而后行.
            GMail/GTalk: yanglinbo#google.com;
            MSN/Email: tx7do#yahoo.com.cn;
            QQ: 3 0 3 3 9 6 9 2 0 .

            SPWebServer:一個(gè)基于 SPServer 的 web 服務(wù)器框架

            from:http://iunknown.javaeye.com/blog/78561

            關(guān)鍵字: C++   libevent spserver http embedded web 服務(wù)器   

            看到這個(gè)題目,估計(jì)很多人會(huì)問:為什么要再實(shí)現(xiàn)一個(gè) web 服務(wù)器?

            這里有幾個(gè)原因:

            1.這是一個(gè) web 服務(wù)器框架,不是一個(gè)完整的 web 服務(wù)器。也就是說 SPWebServer 提供的是一套 API 和類庫,可以方便地集成到現(xiàn)有的應(yīng)用程序中。可以稱 SPWebServer 為 embedded web server 。

            2.有些時(shí)候,我們需要的不是一個(gè)功能強(qiáng)大完整的 web 服務(wù)器(例如 apache ),我們只是需要一個(gè)能提供最基本的 http 功能的服務(wù)器框架。比如要用 C/C++ 實(shí)現(xiàn) XML-RPC,JSON-RPC 服務(wù)器端,或者為 jabberd 實(shí)現(xiàn)一個(gè) http bind 的時(shí)候。這些場(chǎng)景下,也可以使用 apache,但是使用 embedded web server 可以簡(jiǎn)化配置。

            3.在如下的場(chǎng)合中,apache 顯得不合適,而 embedded web server 卻正好合適:在一個(gè)現(xiàn)有的應(yīng)用程序中,用 http 接口來提供一些簡(jiǎn)單的控制和統(tǒng)計(jì)功能。

            基于以上原因,也為了
            1.豐富 SPServer 項(xiàng)目(請(qǐng)參考: SPServer : 一個(gè)基于 Half-Sync/Half-Async 模式的高并發(fā) server 框架)的功能;
            2.正好作為 SPServer 框架的一個(gè)比較好的示范例子;
            因此基于 SPServer 框架實(shí)現(xiàn)了一個(gè) web 服務(wù)器框架。

            源代碼下載:
            http://spserver.googlecode.com/files/spserver-0.5.src.tar.gz
            http://code.google.com/p/spserver/downloads/list

            下面來看一個(gè)使用 SPWebServer 的簡(jiǎn)單例子。


            class SP_HttpEchoHandler : public SP_HttpHandler {   
            public:   
                SP_HttpEchoHandler()
            {}   
                
            virtual ~SP_HttpEchoHandler(){}   
              
                
            virtual void handle( SP_HttpRequest * request, SP_HttpResponse * response ) {   
                    response
            ->setStatusCode( 200 );   
                    response
            ->appendContent( "<html><head>"   
                        
            "<title>Welcome to simple http</title>"   
                        
            "</head><body>" );   
              
                    
            char buffer[ 512 ] = 0 };   
                    snprintf( buffer, 
            sizeof( buffer ),   
                        
            "<p>The requested URI is : %s.</p>", request->getURI() );   
                    response
            ->appendContent( buffer );   
              
                    snprintf( buffer, 
            sizeof( buffer ),   
                        
            "<p>Client IP is : %s.</p>", request->getClientIP() );   
                    response
            ->appendContent( buffer );   
              
                    
            forint i = 0; i < request->getParamCount(); i++ ) {   
                        snprintf( buffer, 
            sizeof( buffer ),   
                            
            "<p>Param - %s = %s<p>", request->getParamName( i ),   
                            request
            ->getParamValue( i ) );   
                        response
            ->appendContent( buffer );   
                    }
                      
              
                    
            forint i = 0; i < request->getHeaderCount(); i++ ) {   
                        snprintf( buffer, 
            sizeof( buffer ),   
                            
            "<p>Header - %s: %s<p>", request->getHeaderName( i ),   
                            request
            ->getHeaderValue( i ) );   
                        response
            ->appendContent( buffer );   
                    }
                      
              
                    
            if( NULL != request->getContent() ) {   
                        response
            ->appendContent( "<p>" );   
                        response
            ->appendContent( request->getContent(),   
                            request
            ->getContentLength() );   
                        response
            ->appendContent( "</p>" );   
                    }
                      
              
                    response
            ->appendContent( "</body></html>\n" );   
                }
                  
            }
            ;   
              
            class SP_HttpEchoHandlerFactory : public SP_HttpHandlerFactory {   
            public:   
                SP_HttpEchoHandlerFactory()
            {}   
                
            virtual ~SP_HttpEchoHandlerFactory(){}   
              
                
            virtual SP_HttpHandler * create() const {   
                    
            return new SP_HttpEchoHandler();   
                }
               
            }
            ;   
              
            //---------------------------------------------------------   
              
            int main( int argc, char * argv[] )   
            {   
                
            int port = 8080;   
              
                SP_Server server( 
            "", port,   
                    
            new SP_HttpHandlerAdapterFactory( new SP_HttpEchoHandlerFactory() ) );   
              
                server.runForever();   
              
                
            return 0;   
            }
               

            上面的代碼演示的是一個(gè) http echo server ,即把 client 發(fā)過來的請(qǐng)求信息顯示在頁面上。

            在最簡(jiǎn)單的情況下,使用 SPWebServer 需要實(shí)現(xiàn)兩個(gè)類:SP_HttpHandler 的子類 和 SP_HttpHandlerFactory 的子類。
            SP_HttpHandler 的子類負(fù)責(zé)處理具體的 http 請(qǐng)求。
            SP_HttpHandlerFactory 的子類協(xié)助 spserver 為每一個(gè)連接創(chuàng)建一個(gè) SP_HttpHandler 子類實(shí)例。

            在實(shí)現(xiàn)過程中,使用了 Adapter 模式,把 SP_HttpHandler 和 SP_HttpHandlerFactory 適配為 SP_Handler 和 SP_HandlerAdapterFactory。這兩個(gè) Adapter 都已經(jīng)實(shí)現(xiàn),不需要使用者來實(shí)現(xiàn)。

            posted on 2007-08-21 01:26 楊粼波 閱讀(410) 評(píng)論(0)  編輯 收藏 引用


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            狠狠色婷婷综合天天久久丁香 | 久久久久亚洲?V成人无码| 精品熟女少妇aⅴ免费久久| 伊人久久大香线蕉AV一区二区| 久久国产免费观看精品3| 开心久久婷婷综合中文字幕| 国内精品久久久久久99蜜桃| 亚洲国产日韩欧美久久| 久久香综合精品久久伊人| 久久青青国产| 亚洲综合精品香蕉久久网| 日韩va亚洲va欧美va久久| 色综合久久综合网观看| 久久99国产乱子伦精品免费| 久久精品国产91久久综合麻豆自制 | 久久精品国产亚洲AV无码偷窥| 久久97精品久久久久久久不卡 | 亚洲午夜久久久久妓女影院| 久久久久久综合一区中文字幕| 久久精品国产精品亚洲下载| 亚洲精品无码久久久久| 国产亚洲美女精品久久久2020| 久久99精品久久久久久动态图| 久久久精品波多野结衣| 婷婷五月深深久久精品| 精品久久久久久无码中文野结衣 | 久久国产精品成人影院| 久久男人中文字幕资源站| 国产亚洲色婷婷久久99精品| 亚洲国产高清精品线久久| 久久国产精品99久久久久久老狼| 无码乱码观看精品久久| 精品久久久久久中文字幕| 久久久久久久精品成人热色戒| 久久精品青青草原伊人| 久久精品国产精品亚洲下载| 狠狠色丁香久久综合婷婷| 久久亚洲精品成人AV| 嫩草影院久久国产精品| 99久久精品免费看国产一区二区三区| 亚洲国产精品热久久|