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

下載本文檔

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

文檔簡介

使用gSOAP進行Webservice開發(fā)總結(jié)Webservice是創(chuàng)建可互操作的分布式應用程序的新平臺。Webservice的主要目標是跨平臺的可互操作性。為了達到這一目標,Webservice是完全基于XML、XSD等獨立于平臺、獨立于軟件供應商的標準的。Webservice在應用程序跨平臺和跨網(wǎng)絡進行通信的時候是非常有用的°Webservice適用于應用程序集成、B2B集成、代碼和數(shù)據(jù)重用,以及通過Web進行客戶端和服務器的通信的場合。南京內(nèi)容與資源管理中心需要為第三方提供DNA識別的接口,由于第三方可能位于不同的局域網(wǎng)中,運行于不同的平臺,以及第三方形式多樣化,為此提供一種通用的接口至關(guān)重要。鑒于Webservice在跨平臺,跨網(wǎng)絡方面的出色表現(xiàn),南京內(nèi)容與資源管理中心需要采用Webservice為第三方提供DNA識別接口。南京內(nèi)容與資源管理中心采用C/C++實現(xiàn),如何快速的實現(xiàn)Webservice接口呢?開源項目gsoap為此提供了很好的解決方案。2.gSOAP介紹gSOAP是一個綁定SOAP/XML到C/C++語言的工具,使用它可以簡單快速地開發(fā)出SOAP/XML的服務器端和客戶端。由于gSOAP具有相當不錯的兼容性,通過gSOAP,我們就可以調(diào)用由Java,.Net,Delhpi,PHP等語言開發(fā)的SOAP服務,或者向它們提供SOAP月服務。gSOAP的編譯器能夠自動的將用戶定義的本地化的C或C++數(shù)據(jù)類型轉(zhuǎn)變?yōu)榉蟈ML語法的數(shù)據(jù)結(jié)構(gòu),反之亦然。這樣,只用一組簡單的API就將用戶從SOAP細節(jié)實現(xiàn)工作中解脫了出來,可以專注與應用程序邏輯的實現(xiàn)工作了。gSOAP編譯器可以集成C/C++和Fortran代碼(通過一個Fortran到C的接口),嵌入式系統(tǒng),其他SOAP程序提供的實時軟件的資源和信息;可以跨越多個操作系統(tǒng),語言環(huán)境以及在防火墻后的不同組織。2.1gSOAP常用工具介紹為了便于開發(fā),gSOAP提供了兩個常用工具:wsdl2h和soapcpp2。這兩個工具主要用來根據(jù)wsdl文件生成開發(fā)過程使用的C/C++文件°Wsdl2h和soapcpp2選項很多,可以滿足不同的需要,詳細了解可以通過wsdl2h-h和soapcpp2-h命令獲取wsdl2h解析wsdl文件生成C/C++語法結(jié)構(gòu)的頭文件,假設生成的頭文件為add.hoadd.h不能用于編碼,供soapcpp2生成客戶端和服務端框架使用。soapcpp2根據(jù)wsdl2h生成的頭文件,生成客戶端和服務端程序框架的頭文件和源文件,生成文件直接用于客戶端和服務端的開發(fā)。以add.h為例,一般會生成如下文件,客戶端:addClient.c,addH.h,addStub.h,add.nsmap,addC.c;月服務端:addServer.c,addC.c,addH.h,addStub.h,add.nsmap。addClient.c:主要實現(xiàn)客戶端遠程調(diào)用接口的實現(xiàn)addC.c:主要實現(xiàn)SOAP協(xié)議的底層封裝,消息通信等addStub.h:遠程接口定義addH.h:SOAP底層實現(xiàn)的相關(guān)定義add.nsmap:名字空間定義addServer.c:處理客戶端SOAP請求開發(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客戶端和服務端在編碼時都需要2>客戶端和服務端的代碼框架可以通過選項控制分開生成2.2gSOAP開發(fā)方法使用gSOAP開發(fā)通常有兩種方法:方法1先編寫wsdl文件,然后使用wsdl2h生成soapcpp2需要的頭文件,最后再使用soapcpp2生成客戶端和服務端需要的框架代碼。方法2直接編寫soapcpp2需要的頭文件,然后使用soapcpp2生成客戶端和服務端需要的框架代碼。編寫頭文件時,必須遵循下面的規(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ù)必須為int類型。返回值僅表示soap調(diào)用是否成功接口的最后一個參數(shù)為輸出參數(shù)如果有多個輸出參數(shù),則必須定義為結(jié)構(gòu),以結(jié)構(gòu)的方式返回結(jié)構(gòu)命名必須和接口在同一個命名空間。比如定義intns—add(inta,ns__addResult*rst),ns__addResult定義為結(jié)構(gòu),命名必須以ns__開頭,否則客戶端和服務端無法正常工作。(如果不一致,在編譯和程序啟動時都不會出錯,但是在消息交互時會導致消息格式錯誤)方法1主要是wsdl編寫起來可能比較麻煩,特別是之前沒有使用過,會覺得有些難度。方法2相對來說編寫起來比較簡單,主要難點在于編寫頭文件的規(guī)則比較嚴謹,同時目前也缺少詳細規(guī)則介紹。基本上出問題都是因為編寫的頭文件不符合soapcpp2的要求。方法1由于是通過wsdl2h生成,基本上避免了這個問題。3.gSOAP開發(fā)實例本章以DNA識別接口為例,詳細介紹gSOAP的開發(fā)流程和主要函數(shù)的使用。DNA識別接口開發(fā)采用直接編寫頭文件的方法。3.1DNA識別接口頭文件定義按照頭文件編寫的規(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生成客戶端和服務端開發(fā)框架soapcpp2-n-pdnaidentify-c-b-Ldna_identify.h使用到的命令選項介紹如下:-N使用業(yè)務名稱重命名函數(shù)和命名空間表-p使用新的前綴替代soap-c生成純C的代碼-b字符數(shù)組序列化為string對象-L不生成soapCIientLib/soapServerLib生成的文件如下:dnaidentifyC.c,dnaidentifyClient.c,dnaidentifyH.h,dnaidentify.nsmap,dnaidentifyServer.c,dnaidentifyStub.h。按照2.1的介紹,分別拷貝客戶端和服務端需要的文件到各自的工程中。同時需要拷貝gsoap安裝目錄下的stdsoap2.c(pp),stdsoap2.h到客戶端和服務端的工程中。stdsoap2.c和stdsoap2.cpp內(nèi)容完全相同,如果是C++開發(fā),則拷貝stdsoap2.cpp,如果是C開發(fā),則拷貝stdsoap2.c。客戶端開發(fā)介紹客戶端的開發(fā)比較簡單,main函數(shù)中核心代碼只有幾行:structsoapdna_idt_soap; 〃定義一個soap類型的對象soap_init(&dna_idt_soap);〃調(diào)用soap_init初始化soap_set_namespaces(&dna_idt_soap,namespaces);//設置命名空間soap_call_ns__dnaidentify(&dna_idt_soap,server,"",req,rsp);〃調(diào)用服務端提供接口,server為服務地址,包含端口,req是輸入?yún)?shù),rsp是輸出參數(shù)soap_end(&dna_idt_soap);soap_done(&dna_idt_soap);服務端開發(fā)介紹服務端的開發(fā)也比較簡單,考慮到多線程的時候比較復雜。3.4.1服務端使用單線程main函數(shù)中主要代碼如下:structsoapdna_soap_server;〃定義一個soap類型的對象soap_init(&dna_soap_server);〃調(diào)用soap_init初始化soap_set_namespaces(&dna_soap_server,namespaces);soap_bind(&dna_soap_server,NULL,8080,100);//服務端口綁定soap_accept(&dna_soap_server);〃接受客戶端的請求dnaidentify_serve(&dna_soap_server);//調(diào)用服務端的dna識別服務,此方法是soapcpp自動生成的,最終會調(diào)用dna_identify.h中定義的ns—dnaidentify方法,此方法需要服務端實現(xiàn)。soap_end(&dna_soap_server);soap_down(&dna_soap_server);3.4.2服務端使用多線程多線程實現(xiàn)時,采用隊列來保存客戶端的請求,同時啟動多個線程處理隊列中的請求消息,并且對隊列進行保護。定義全局變量:pthread_mutex_tqueue_cs;〃隊列鎖pthread_cond_tqueue_cv;〃條件變量SOAP_SOCKETqueue[MAX_QUEUE];///數(shù)組隊歹Uinthead=0,tail=0;〃隊列頭和隊列尾定義函數(shù)void*dna_identify_process(void*soap);//線程入口函數(shù)intenqueue(SOAP_SOCKETss);〃入隊列函數(shù)SOAP_SOCKETdequeue(void); 〃出隊列函數(shù)main函數(shù)中主要代碼structsoapdna_soap_server;〃定義一個soap類型的對象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);//服務端口綁定〃創(chuàng)建服務線程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){〃客戶端請求入隊列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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論