使用gsoap進(jìn)行webservice開發(fā)總結(jié)_第1頁(yè)
使用gsoap進(jìn)行webservice開發(fā)總結(jié)_第2頁(yè)
使用gsoap進(jìn)行webservice開發(fā)總結(jié)_第3頁(yè)
使用gsoap進(jìn)行webservice開發(fā)總結(jié)_第4頁(yè)
使用gsoap進(jìn)行webservice開發(fā)總結(jié)_第5頁(yè)
已閱讀5頁(yè),還剩4頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

使用gSOAP進(jìn)行Webservice開發(fā)總結(jié)Webservice是創(chuàng)建可互操作的分布式應(yīng)用程序的新平臺(tái)。Webservice的主要目標(biāo)是跨平臺(tái)的可互操作性。為了達(dá)到這一目標(biāo),Webservice是完全基于XML、XSD等獨(dú)立于平臺(tái)、獨(dú)立于軟件供應(yīng)商的標(biāo)準(zhǔn)的。Webservice在應(yīng)用程序跨平臺(tái)和跨網(wǎng)絡(luò)進(jìn)行通信的時(shí)候是非常有用的°Webservice適用于應(yīng)用程序集成、B2B集成、代碼和數(shù)據(jù)重用,以及通過Web進(jìn)行客戶端和服務(wù)器的通信的場(chǎng)合。南京內(nèi)容與資源管理中心需要為第三方提供DNA識(shí)別的接口,由于第三方可能位于不同的局域網(wǎng)中,運(yùn)行于不同的平臺(tái),以及第三方形式多樣化,為此提供一種通用的接口至關(guān)重要。鑒于Webservice在跨平臺(tái),跨網(wǎng)絡(luò)方面的出色表現(xiàn),南京內(nèi)容與資源管理中心需要采用Webservice為第三方提供DNA識(shí)別接口。南京內(nèi)容與資源管理中心采用C/C++實(shí)現(xiàn),如何快速的實(shí)現(xiàn)Webservice接口呢?開源項(xiàng)目gsoap為此提供了很好的解決方案。2.gSOAP介紹gSOAP是一個(gè)綁定SOAP/XML到C/C++語(yǔ)言的工具,使用它可以簡(jiǎn)單快速地開發(fā)出SOAP/XML的服務(wù)器端和客戶端。由于gSOAP具有相當(dāng)不錯(cuò)的兼容性,通過gSOAP,我們就可以調(diào)用由Java,.Net,Delhpi,PHP等語(yǔ)言開發(fā)的SOAP服務(wù),或者向它們提供SOAP月服務(wù)。gSOAP的編譯器能夠自動(dòng)的將用戶定義的本地化的C或C++數(shù)據(jù)類型轉(zhuǎn)變?yōu)榉蟈ML語(yǔ)法的數(shù)據(jù)結(jié)構(gòu),反之亦然。這樣,只用一組簡(jiǎn)單的API就將用戶從SOAP細(xì)節(jié)實(shí)現(xiàn)工作中解脫了出來(lái),可以專注與應(yīng)用程序邏輯的實(shí)現(xiàn)工作了。gSOAP編譯器可以集成C/C++和Fortran代碼(通過一個(gè)Fortran到C的接口),嵌入式系統(tǒng),其他SOAP程序提供的實(shí)時(shí)軟件的資源和信息;可以跨越多個(gè)操作系統(tǒng),語(yǔ)言環(huán)境以及在防火墻后的不同組織。2.1gSOAP常用工具介紹為了便于開發(fā),gSOAP提供了兩個(gè)常用工具:wsdl2h和soapcpp2。這兩個(gè)工具主要用來(lái)根據(jù)wsdl文件生成開發(fā)過程使用的C/C++文件°Wsdl2h和soapcpp2選項(xiàng)很多,可以滿足不同的需要,詳細(xì)了解可以通過wsdl2h-h和soapcpp2-h命令獲取wsdl2h解析wsdl文件生成C/C++語(yǔ)法結(jié)構(gòu)的頭文件,假設(shè)生成的頭文件為add.hoadd.h不能用于編碼,供soapcpp2生成客戶端和服務(wù)端框架使用。soapcpp2根據(jù)wsdl2h生成的頭文件,生成客戶端和服務(wù)端程序框架的頭文件和源文件,生成文件直接用于客戶端和服務(wù)端的開發(fā)。以add.h為例,一般會(huì)生成如下文件,客戶端:addClient.c,addH.h,addStub.h,add.nsmap,addC.c;月服務(wù)端:addServer.c,addC.c,addH.h,addStub.h,add.nsmap。addClient.c:主要實(shí)現(xiàn)客戶端遠(yuǎn)程調(diào)用接口的實(shí)現(xiàn)addC.c:主要實(shí)現(xiàn)SOAP協(xié)議的底層封裝,消息通信等addStub.h:遠(yuǎn)程接口定義addH.h:SOAP底層實(shí)現(xiàn)的相關(guān)定義add.nsmap:名字空間定義addServer.c:處理客戶端SOAP請(qǐng)求開發(fā)過程中使用到的接口基本上都是在***Stub.h中定義的,例如:*Server-SideOperations*Server-SideOperationsSOAPFMAC5intSOAPFMAC5intSOAP_FMAC6ns add(structsoap*,struetns addReqreq,structns addRsp*rsp);*Server-SideSkeletonsto*Server-SideSkeletonstoInvokeServiceOperations*Client-SideCallStubsSOAP_FMAC5*Client-SideCallStubsSOAP_FMAC5intSOAP_FMAC6soap_call_ns add(structsoap*soap,constchar*soap_endpoint,constchar*soap_actionzstructnsaddReqreq,structnsaddRsp*rsp);SOAP_FMAC5intSOAP_FMAC6addserve(structsoap*);SOAP_FMAC5intSOAP_FMAC6addserverequest(stMuutsoap*);SOAP_FMAC5intSOAP_FMAC6soapservensadd(structsoap*)1>addC.c,addStub.h,addH.h,add.nsmap客戶端和服務(wù)端在編碼時(shí)都需要2>客戶端和服務(wù)端的代碼框架可以通過選項(xiàng)控制分開生成2.2gSOAP開發(fā)方法使用gSOAP開發(fā)通常有兩種方法:方法1先編寫wsdl文件,然后使用wsdl2h生成soapcpp2需要的頭文件,最后再使用soapcpp2生成客戶端和服務(wù)端需要的框架代碼。方法2直接編寫soapcpp2需要的頭文件,然后使用soapcpp2生成客戶端和服務(wù)端需要的框架代碼。編寫頭文件時(shí),必須遵循下面的規(guī)則:頭文件開頭必須包含下面的內(nèi)容//gsoapnsservicename:add//gsoapnsservicenamespace:http://localhost/add.wsdl//gsoapnsservicelocation:http://localhost//gsoapnsserviceexecutable:add.cgi//gsoapnsserviceencoding:encoded//gsoapnsschemanamespace:urn:add接口名必須為ns_XXXX的格式,ns(命名空間前綴)可以根據(jù)實(shí)際需要修改,命名空間前綴和函數(shù)名之間必須為兩個(gè)下劃線。接口返回參數(shù)必須為int類型。返回值僅表示soap調(diào)用是否成功接口的最后一個(gè)參數(shù)為輸出參數(shù)如果有多個(gè)輸出參數(shù),則必須定義為結(jié)構(gòu),以結(jié)構(gòu)的方式返回結(jié)構(gòu)命名必須和接口在同一個(gè)命名空間。比如定義intns—add(inta,ns__addResult*rst),ns__addResult定義為結(jié)構(gòu),命名必須以ns__開頭,否則客戶端和服務(wù)端無(wú)法正常工作。(如果不一致,在編譯和程序啟動(dòng)時(shí)都不會(huì)出錯(cuò),但是在消息交互時(shí)會(huì)導(dǎo)致消息格式錯(cuò)誤)方法1主要是wsdl編寫起來(lái)可能比較麻煩,特別是之前沒有使用過,會(huì)覺得有些難度。方法2相對(duì)來(lái)說編寫起來(lái)比較簡(jiǎn)單,主要難點(diǎn)在于編寫頭文件的規(guī)則比較嚴(yán)謹(jǐn),同時(shí)目前也缺少詳細(xì)規(guī)則介紹?;旧铣鰡栴}都是因?yàn)榫帉懙念^文件不符合soapcpp2的要求。方法1由于是通過wsdl2h生成,基本上避免了這個(gè)問題。3.gSOAP開發(fā)實(shí)例本章以DNA識(shí)別接口為例,詳細(xì)介紹gSOAP的開發(fā)流程和主要函數(shù)的使用。DNA識(shí)別接口開發(fā)采用直接編寫頭文件的方法。3.1DNA識(shí)別接口頭文件定義按照頭文件編寫的規(guī)則編寫接口。如下://gsoapnsservicename:dnaidentify//gsoapnsservicenamespace:http://localhost/dnaidentify.wsdl//gsoapnsservicelocation:http://localhost//gsoapnsserviceexecutable:dnaidentify.cgi//gsoapnsserviceencoding:encoded//gsoapnsschemanamespace:urn:dnaidentifystructns__dnaidentifyReqchartransactionid[36];

charinfohash[44];charcontenthash[44];intreqcontenttype;charformat[12];};structns__dnaidentifyRsp{intresult;charinfohash[44];charcontenthash[44];charcontentname[256];intcontenttype;intsimilarity;chardnatype[64];intdnaid;charftpserver[48];charftpuser[24];charftppswd[24];charftppath[255];};intns__dnaidentify(structns__dnaidentifyReqreq,structns__dnaidentifyRsp*rsp);3.2生成客戶端和服務(wù)端開發(fā)框架soapcpp2-n-pdnaidentify-c-b-Ldna_identify.h使用到的命令選項(xiàng)介紹如下:-N使用業(yè)務(wù)名稱重命名函數(shù)和命名空間表-p使用新的前綴替代soap-c生成純C的代碼-b字符數(shù)組序列化為string對(duì)象-L不生成soapCIientLib/soapServerLib生成的文件如下:dnaidentifyC.c,dnaidentifyClient.c,dnaidentifyH.h,dnaidentify.nsmap,dnaidentifyServer.c,dnaidentifyStub.h。按照2.1的介紹,分別拷貝客戶端和服務(wù)端需要的文件到各自的工程中。同時(shí)需要拷貝gsoap安裝目錄下的stdsoap2.c(pp),stdsoap2.h到客戶端和服務(wù)端的工程中。stdsoap2.c和stdsoap2.cpp內(nèi)容完全相同,如果是C++開發(fā),則拷貝stdsoap2.cpp,如果是C開發(fā),則拷貝stdsoap2.c??蛻舳碎_發(fā)介紹客戶端的開發(fā)比較簡(jiǎn)單,main函數(shù)中核心代碼只有幾行:structsoapdna_idt_soap; 〃定義一個(gè)soap類型的對(duì)象soap_init(&dna_idt_soap);〃調(diào)用soap_init初始化soap_set_namespaces(&dna_idt_soap,namespaces);//設(shè)置命名空間soap_call_ns__dnaidentify(&dna_idt_soap,server,"",req,rsp);〃調(diào)用服務(wù)端提供接口,server為服務(wù)地址,包含端口,req是輸入?yún)?shù),rsp是輸出參數(shù)soap_end(&dna_idt_soap);soap_done(&dna_idt_soap);服務(wù)端開發(fā)介紹服務(wù)端的開發(fā)也比較簡(jiǎn)單,考慮到多線程的時(shí)候比較復(fù)雜。3.4.1服務(wù)端使用單線程main函數(shù)中主要代碼如下:structsoapdna_soap_server;〃定義一個(gè)soap類型的對(duì)象soap_init(&dna_soap_server);〃調(diào)用soap_init初始化soap_set_namespaces(&dna_soap_server,namespaces);soap_bind(&dna_soap_server,NULL,8080,100);//服務(wù)端口綁定soap_accept(&dna_soap_server);〃接受客戶端的請(qǐng)求dnaidentify_serve(&dna_soap_server);//調(diào)用服務(wù)端的dna識(shí)別服務(wù),此方法是soapcpp自動(dòng)生成的,最終會(huì)調(diào)用dna_identify.h中定義的ns—dnaidentify方法,此方法需要服務(wù)端實(shí)現(xiàn)。soap_end(&dna_soap_server);soap_down(&dna_soap_server);3.4.2服務(wù)端使用多線程多線程實(shí)現(xiàn)時(shí),采用隊(duì)列來(lái)保存客戶端的請(qǐng)求,同時(shí)啟動(dòng)多個(gè)線程處理隊(duì)列中的請(qǐng)求消息,并且對(duì)隊(duì)列進(jìn)行保護(hù)。定義全局變量:pthread_mutex_tqueue_cs;〃隊(duì)列鎖pthread_cond_tqueue_cv;〃條件變量SOAP_SOCKETqueue[MAX_QUEUE];///數(shù)組隊(duì)歹Uinthead=0,tail=0;〃隊(duì)列頭和隊(duì)列尾定義函數(shù)void*dna_identify_process(void*soap);//線程入口函數(shù)intenqueue(SOAP_SOCKETss);〃入隊(duì)列函數(shù)SOAP_SOCKETdequeue(void); 〃出隊(duì)列函數(shù)main函數(shù)中主要代碼structsoapdna_soap_server;〃定義一個(gè)soap類型的對(duì)象soap*dna_soap[MAX_PID];soap_init(&dna_soap_server);〃調(diào)用soap_init初始化soap_set_namespaces(&dna_soap_server,namespaces);soap_bind(&dna_soap_server,NULL,8080,100);//服務(wù)端口綁定〃創(chuàng)建服務(wù)線程for(i=0;ivMAX_PID;i++){dna_soap[i]=soap_copy(&dna_soap_server);pth_id=pthread_create(&tid[i],NULL,(void*(*)(void*))dna_identify_process,(void*)dna_soap[i]);if(pth_id!=0){〃客戶端請(qǐng)求入隊(duì)列for(;;){s=soap_accept(&dna_soap_server);while(enqueue(s)==SOAP_EOM){}}〃線程入口函數(shù)核心代碼void*dna_identify_process(void*soap){structsoap*tsoap=(structsoap*)soap;for(;;){tsoap->sock

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論