• <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 閱讀(1734) 評論(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)

            積分與排名

            最新評論

            閱讀排行榜

            評論排行榜

            亚洲国产一成久久精品国产成人综合| 婷婷综合久久中文字幕蜜桃三电影| 国内精品久久九九国产精品| 久久久久久久尹人综合网亚洲| 久久人人爽人人爽人人片AV东京热| 久久久久亚洲精品日久生情| 久久综合久久综合九色| 亚洲国产视频久久| 久久久精品国产sm调教网站 | 国产成人精品三上悠亚久久| 2021少妇久久久久久久久久| 日韩va亚洲va欧美va久久| 久久久久久久久无码精品亚洲日韩 | 精品熟女少妇AV免费久久| 99久久精品免费看国产| 色欲综合久久中文字幕网| 久久久精品国产亚洲成人满18免费网站| 一本色道久久综合| 国产精自产拍久久久久久蜜| 久久久久久久人妻无码中文字幕爆| 久久精品视频一| 欧美久久一区二区三区| 韩国三级中文字幕hd久久精品| 久久久久久毛片免费播放| 亚洲色大成网站www久久九| 无码任你躁久久久久久久| 精品久久久久久无码人妻热 | 中文字幕久久亚洲一区| 久久综合五月丁香久久激情| 久久播电影网| 久久精品国产一区二区电影| 久久中文娱乐网| 国产精品成人99久久久久 | 久久99精品国产99久久6男男| 97久久国产露脸精品国产| 久久天天躁狠狠躁夜夜2020一| 综合久久一区二区三区 | 精品熟女少妇a∨免费久久| 99久久精品国产一区二区 | 久久91这里精品国产2020| 亚洲欧美精品伊人久久|