• <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>

            woaidongmao

            文章均收錄自他人博客,但不喜標(biāo)題前加-[轉(zhuǎn)貼],因其丑陋,見(jiàn)諒!~
            隨筆 - 1469, 文章 - 0, 評(píng)論 - 661, 引用 - 0
            數(shù)據(jù)加載中……

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

            fromhttp://iunknown.javaeye.com/blog/78561

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

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

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

            1.這是一個(gè) web 服務(wù)器框架,不是一個(gè)完整的 web 服務(wù)器。也就是說(shuō) SPWebServer 提供的是一套 API 和類庫(kù),可以方便地集成到現(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-RPCJSON-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 接口來(lái)提供一些簡(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

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

             

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

             

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

            在最簡(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)過(guò)程中,使用了 Adapter 模式,把 SP_HttpHandler SP_HttpHandlerFactory 適配為 SP_Handler SP_HandlerAdapterFactory。這兩個(gè) Adapter 都已經(jīng)實(shí)現(xiàn),不需要使用者來(lái)實(shí)現(xiàn)。

             

            posted on 2009-07-13 10:53 肥仔 閱讀(1012) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Web-后臺(tái)

            色偷偷888欧美精品久久久| 中文字幕无码久久久| 99久久婷婷国产综合亚洲| 精品国产乱码久久久久久1区2区| 九九久久自然熟的香蕉图片| 久久综合久久自在自线精品自| 久久精品国产亚洲av影院| 久久精品人人做人人爽电影| 久久久噜噜噜久久| 亚洲狠狠婷婷综合久久久久| 国产亚洲精品美女久久久| 国产午夜精品久久久久九九电影| 无码乱码观看精品久久| 99精品国产综合久久久久五月天| 狠狠色丁香婷婷综合久久来| 亚洲中文字幕伊人久久无码| 国产精品久久久久jk制服| 久久中文精品无码中文字幕| 国内精品久久久久伊人av| 久久影视综合亚洲| 综合久久给合久久狠狠狠97色| 午夜精品久久久久久| 粉嫩小泬无遮挡久久久久久| 久久97久久97精品免视看| 久久99精品久久久久婷婷| 伊人色综合久久天天人守人婷 | 久久久久免费看成人影片| 久久亚洲高清综合| 青青草原1769久久免费播放| 亚洲伊人久久精品影院| 亚洲国产精品狼友中文久久久| 91精品婷婷国产综合久久| 狠狠狠色丁香婷婷综合久久五月| 亚洲αv久久久噜噜噜噜噜| 人妻无码αv中文字幕久久琪琪布 人妻无码精品久久亚瑟影视 | 欧美国产精品久久高清| 中文字幕久久欲求不满| 久久精品男人影院| 久久国产影院| 久久99精品国产麻豆婷婷| 精品久久久久久国产三级|