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

            Codejie's C++ Space

            Using C++

            GSOAP:使用模版封裝Serivce線程

            通過GSOAP自帶的wsdl2h和soap2cpp可以生成基于C++語言的服務端代碼Service和客戶端代碼Proxy,這樣調用起來就很方便了。對于Service來說,只要將其放到一個線程中,等待客戶端連接并相應請求就可以了;而對于客戶端,直接調用Proxy對象的方法就可以向服務端發送請求了。
            ??? 好用是好用,但如果Service很多的話,每個都寫一次線程封裝,這太可怕了,而一個線程帶動全部Service由不現實,這時,C++模版的威力就體現出來了~看如下代碼實例:
            #ifndef?__SOAPSERVICETASKTEMPLATE_H__
            #define?__SOAPSERVICETASKTEMPLATE_H__

            #include?
            <string>
            #include?
            <iostream>

            #include?
            "acex/ACEX.h"
            #include?
            "acex/Task.h"

            #include?
            "stdsoap2.h"

            template
            <typename?T>
            class?CSoapServiceObject?:?public?T
            {
            public:

            public:
            ????CSoapServiceObject()?{}
            ????
            virtual?~CSoapServiceObject()?{}

            ????
            int?Init(const?std::string&?strAddr);
            ????
            void?Shutdown()?{?_bStop?=?true;?}
            public:
            ????
            virtual?int?svc();
            private:
            ????
            bool?_bStop;
            ????std::
            string?_strHost;
            ????unsigned?
            short?_usPort;
            };

            template
            <typename?T>
            int?CSoapServiceObject<T>::Init(const?std::string?&strAddr)
            {
            ????std::
            string::size_type?pos?=?strAddr.find(":");
            ????
            if(pos?!=?std::string::npos)
            ????{
            ????????_strHost?
            =?strAddr.substr(pos?+?1);
            ????????_usPort?
            =?ACE_OS::atoi(_strHost.c_str());
            ????????_strHost?
            =?strAddr.substr(0,?pos);
            ????}
            ????
            else
            ????{
            ????????_usPort?
            =?ACE_OS::atoi(strAddr.c_str());
            ????}
            ????
            return?0;
            }

            template
            <typename?T>
            int?CSoapServiceObject<T>::svc()
            {
            ????
            if(_strHost.empty())
            ????{
            ????????
            if(!soap_valid_socket(this->bind(NULL,?_usPort,?100)))
            ????????????
            return?this->error;
            ????}
            ????
            else
            ????{
            ????????
            if(!soap_valid_socket(this->bind(_strHost.c_str(),?_usPort,?100)))
            ????????????
            return?this->error;
            ????}

            ????
            while(!_bStop)
            ????{
            ????????
            if(!soap_valid_socket(this->accept()))
            ????????????
            return?this->error;
            ????????
            this->serve();
            ????????soap_destroy(
            this);
            ????????soap_end(
            this);
            ????}
            ????
            return?0;
            }


            //////////////////////////////////////////////////////////////////////////
            template<typename?T>
            class?CSoapServiceTask?:?public?ACEX_Synch_Task
            {
            public:
            ????CSoapServiceTask()?{}
            ????
            virtual?~CSoapServiceTask()?{}

            ????
            int?Init(const?std::string&?strAddr);
            ????
            void?Shutdown();

            protected:
            ????
            virtual?int?svc();
            private:
            ????T?_objService;
            };

            template
            <typename?T>
            int?CSoapServiceTask<T>::Init(const?std::string&?strAddr)
            {
            ????
            return?_objService.Init(strAddr);
            }

            template
            <typename?T>
            void?CSoapServiceTask<T>::Shutdown()
            {
            ????_objService.Shutdown();
            }

            template
            <typename?T>
            int?CSoapServiceTask<T>::svc()
            {
            ????
            return?_objService.svc();
            }

            #endif


            ??? 以上是對Service的封裝,使用時,只要用如下語句即可:
            if(Service.Init(strAddr)?==?0)
            {
            ??Service.activate();
            }

            ??? 下面是一個使用實例:
            #include?"SoapServiceTaskTemplate.h"
            #include?
            "soapSmsNotificationBindingService.h"

            class?CSoapNotifyServiceObject?:?public?CSoapServiceObject<SmsNotificationBindingService>
            {
            public:
            ????CSoapNotifyServiceObject();
            ????
            virtual?~CSoapNotifyServiceObject();

            public:
            ????
            virtual????int?notifySmsReception(isag5__notifySmsReception?*isag5__notifySmsReception_,?isag5__notifySmsReceptionResponse?*isag5__notifySmsReceptionResponse_);
            ????
            virtual????int?notifySmsDeliveryReceipt(isag5__notifySmsDeliveryReceipt?*isag5__notifySmsDeliveryReceipt_,?isag5__notifySmsDeliveryReceiptResponse?*isag5__notifySmsDeliveryReceiptResponse_);
            };

            typedef?CSoapServiceTask
            <CSoapNotifyServiceObject>?TSoapNotifyServiceTask;
            typedef?ACE_Singleton
            <TSoapNotifyServiceTask,?ACE_Recursive_Thread_Mutex>?TSoapNotifyServiceTask_Singleton;
            #define?SoapNotifyServiceTask?TSoapNotifyServiceTask_Singleton::instance()

            ??? 使用如上方法,只需編寫Service相應的函數即可,大大減少編寫重復代碼的時間,爽了~
            ??? 例子中使用的一個基類 ACEX_Synch_Task,是基于ACE封裝的線程類,功能和其它線程類類似,svc()函數為線程處理部分函數。WebService使用的是一個通訊行業的接口規范,不復雜,就是Service多的要命~

            ??? GSOAP使用的感覺就是--厲害但不好用。。。。。可能是我對WebService規范和GSOAP不熟悉所致,反正用起來很不順手,比如Service請求不能異步應答,對于通訊消息處理代碼寫多的我來說,這個很不習慣,當然也許是GSOAP支持,是我不會用。。。

            ??? GSOAP不好用,弄得我都想自己寫個基于C++的WebService庫來,但簡單看了SOAP規范后,我放棄了。。。太復雜了,每個三五個月,是不可能實現的。。。

            posted on 2009-07-03 18:20 codejie 閱讀(1733) 評論(2)  編輯 收藏 引用 所屬分類: C++

            評論

            # re: GSOAP:使用模版封裝Serivce線程 2009-08-10 09:21 uwinb

            soap_bind() 和 soap_accept() 等都定義在stdsoap2.cpp文件中
            只有soap_serve()定義在soapServer.cpp文件中,與具體接口相關
            所以即使不用模板這把利劍,通過函數指針也可以很好地封裝代碼

            另一方面如果把多個wsdl文件合并后再生成代碼,(當然我不會合并啦)
            所有的接口不就能共用同一個服務器了  回復  更多評論   

            # re: GSOAP:使用模版封裝Serivce線程 2009-08-10 10:57 codejie

            嗯,模版我只是用到很習慣,函數指針,我一直認為有點偏C,所以用的很少,也許按你的思路作會再簡單些~

            多個WSDL合并,GSOAP是支持的,而且也蠻好用的;但是--我要用到的多個WSDL文件比較‘笨蛋’,其內部定義的類型和調用在不同的文件中存在同名問題,這個搞死我了~  回復  更多評論   

            公告

            Using C++

            導航

            統計

            留言簿(73)

            隨筆分類(513)

            積分與排名

            最新評論

            閱讀排行榜

            評論排行榜

            99久久免费国产精精品| 亚洲国产精品一区二区三区久久| 久久精品国产免费观看| 久久婷婷激情综合色综合俺也去| 久久精品一区二区三区不卡| 国产精品无码久久综合网| 久久精品国产日本波多野结衣| 久久精品一区二区| 久久精品无码一区二区WWW| 91久久精品视频| 中文字幕乱码久久午夜| 国产精品99久久久久久宅男| 国产精品久久久久a影院| 丁香久久婷婷国产午夜视频| 色综合久久久久综合体桃花网| 久久亚洲天堂| 狠狠色丁香婷婷综合久久来来去 | 久久精品极品盛宴观看| 青青青青久久精品国产h| 亚洲精品无码久久千人斩| 久久精品国产精品亚洲艾草网美妙| 少妇内射兰兰久久| 久久WWW免费人成一看片| 内射无码专区久久亚洲| 日韩一区二区久久久久久| 久久99精品国产自在现线小黄鸭 | 久久99国内精品自在现线| 亚洲乱码日产精品a级毛片久久| 欧美综合天天夜夜久久| 精品无码久久久久久尤物| 亚洲精品乱码久久久久久自慰 | 国产免费久久精品丫丫| 99久久99久久精品国产片| 香港aa三级久久三级| 91精品国产色综久久| 精品一区二区久久久久久久网站| 99久久99这里只有免费费精品| 热re99久久6国产精品免费| 狠狠综合久久AV一区二区三区| 亚洲中文字幕无码久久综合网| 久久久久国产精品人妻|