数据读取服务基于gsoap的服务发布

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

数据读取服务基于gsoap的服务发布一、主要流程1)制作服务头文件2)使用gsoap生成相应文件3)建立工程与编译4)测试一、制作服务头文件头文件制作需要根据服务的功能来制作。由自己书写,比如要传入一个文件名,返回一个读取的数据文件数据块。//gsoapnsservicename:ImageServer//gsoapnsservicenamespace:::ImageServer.cgi//gsoapnsserviceencoding:encoded//gsoapnsschemanamespace:urn:ImageServerstructxsd__base64Binary{unsignedchar*__ptr;int__size;};intns__ImageServer(char*fileName,structxsd__base64Binary&ret);说明:上述每一行都加上。//gsoapnsservicename:ImageServer指定服务名称//gsoapnsservicenamespace:发布地址//gsoapnsschemanamespace:urn:ImageServer架构名称这些内容主要用于生成WDSL文件,相应的内容可能还会有变最主要的内容是structxsd__base64Binary{unsignedchar*__ptr;int__size;};intns__ImageServer(char*fileName,structxsd__base64Binary&ret);其中xsd_base64Binary定义了一个返回结构。注意:因为gsoap只允许一个返回值,因此,多返回值需要用到结构返回。文件制作完成则保存为imageserver.h二、使用gsoap生成相应的文件相应的作法是在下载的gsoap目录下新建一个目录。将soapcpp2.exe拷入。此文件可以从bin中找到目录中只有两个文件即Soapcpp2.exeImagewerver.h进入命令行方法,进入当前目录运行soapcpp2.exeimageserver.h回车当imagerserver.h没有错误时,将生成一系列文件命令行将生成如此信息。在此目录下,将生成以下文件三、建立工程与编译1、建立服务器端工程打开VC++建立一个命令行工程。将相应.h和.cpp文件加入注意需要将gsoap目录下的stdsoap2.hcpp文件加入到目录下。生成的工程文件列表如图其中T3DPD_FileDBMapping文件不是自动生成的,此处为后来的读取服务所用。生成的文件中并不存在ImgServer.cpp文件使用自己增加,完成如下:#includeImageServer.nsmap#includeFreeImage.h#includeT3DPD_FileDBMapping.h/**Genericimageloader@paramlpszPathNamePointertothefullfilename@paramflagOptionalloadflagconstant@returnReturnstheloadeddibifsuccessful,returnsNULLotherwise*/FIBITMAP*GenericLoader(constchar*lpszPathName,intflag){FREE_IMAGE_FORMATfif=FIF_UNKNOWN;fif=FreeImage_GetFileType(lpszPathName,0);if(fif==FIF_UNKNOWN){//nosignature?//trytoguessthefileformatfromthefileextensionfif=FreeImage_GetFIFFromFilename(lpszPathName);}//checkthatthepluginhasreadingcapabilities...if((fif!=FIF_UNKNOWN)&&FreeImage_FIFSupportsReading(fif)){//ok,let'sloadthefileFIBITMAP*dib=FreeImage_Load(fif,lpszPathName,flag);//unlessabadfileformat,wearedone!returndib;}returnNULL;}////server端的实现函数与add.h中声明的函数相同,但是多了一个当前的soap连接的参数intns__ImageServer(structsoap*add_soap,char*fileName,structxsd__base64Binary&ret){if(fileName!=NULL){std::stringpFileName(fileName);charexeFullPath[MAX_PATH];//Fullpathstd::stringstrPath=;GetModuleFileName(NULL,exeFullPath,MAX_PATH);strPath=(std::string)exeFullPath;//Getfullpathofthefileintpos=strPath.find_last_of('\\',strPath.length());std::stringsPath=strPath.substr(0,pos);//std::stringsFileName=sPath++\\+pFileName;FIBITMAP*image=NULL;//GenericLoader(sFileName.c_str(),0);if(image==NULL){CT3DPD_FileDBMappingpImgFile;pImgFile.OpenForRead(sFileName);ret.__size=pImgFile.GetSize();BYTE*pData=newBYTE[ret.__size];ret.__ptr=(unsignedchar*)soap_malloc(add_soap,ret.__size);pImgFile.GetBlockData(0,ret.__size,pData);memset(ret.__ptr,0,ret.__size);memcpy(ret.__ptr,pData,ret.__size);/*src_ptr为源数据块指针*/pImgFile.Close();}else{ret.__ptr=(unsignedchar*)FreeImage_GetBits(image);}returnSOAP_OK;}return1;}voidmain(intargc,char*argv){structsoapsoap;intm,s;//masterandslavesocketssoap_init(&soap);m=soap_bind(&soap,NULL,18083,100);if(m0)soap_print_fault(&soap,stderr);else{fprintf(stderr,Socketconnectionsuccessful:mastersocket=%d\n,m);for(inti=1;;i++){s=soap_accept(&soap);if(s0){soap_print_fault(&soap,stderr);break;}fprintf(stderr,%d:acceptedconnectionfromIP=%d.%d.%d.%dsocket=%d,i,(soap.ip24)&0xFF,(soap.ip16)&0xFF,(soap.ip8)&0xFF,soap.ip&0xFF,s);if(soap_serve(&soap)!=SOAP_OK)//processRPCrequestsoap_print_fault(&soap,stderr);//printerrorfprintf(stderr,requestserved\n);soap_destroy(&soap);//cleanupclassinstancessoap_end(&soap);//cleanupeverythingandclosesocket}}soap_done(&soap);//closemastersocketanddetachcontext}注意:本文使用的是standalone的方法进行服务发布,即通过端口访问的方式。注意:imagerserver.himageserver.nsmp等文件需要能访问到,可以直接放到工程源文件目录下。客户端工程与服务器端类似,使用VC创建一个工程,并将相应的内容加载进同样,T3DPD系列文件是后面为应用需要增加。ImgClient.cpp不是自动生成的。需要手工创建代码如下:#includestdio.h#includestdlib.h#includesoapH.h#includeImageServer.nsmap#includeT3DPD_FileDBMapping.hintGetImg(constchar*server,char*fileName,structxsd__base64Binary&r);intmain(intargc,char**argv){intresult=-1;char*server==0;intnum2=0;intsum=0;charp[]=world.tif;structxsd__base64Binary_r;result=GetImg(server,p,_r);if(result!=0){printf(soaperr,errcode=%d\n,result);}else{printf(Readscuessful!\n);}return0;}intGetImg(constchar*server,char*fileName,structxsd__base64Binary&r){structsoapadd_soap;intresult=0;soap_init(&add_soap);//该函数是客户端调用的主要函数,后面几个参数和add.h中声明的一样,前面多了个参数,函数名是接口函数名ns__add前面加上soap_call_soap_call_ns__ImageServer(&add_soap,server,,fileName,r);CT3DPD_FileDBMappingpImgSave;charp1[]=e:\\world2.tif;pImgSave.OpenForWriter(p1);pImgSave.SetBlockDate(0,r.__size,r.__ptr);pImgSave.Close();if(add_soap.error){printf(soaperror:%d,%s,%s\n,add_soap.error,*soap_faultcode(&add_soap),*soap_faultstring(&add_soap));result=add_soap.error;}soap_end(&add_soap);soap_done(&add_soap);returnresult;}分别编译成两个可执行文件。四、测试与运行运行服务器端程序,正常将出现运行客户端程序,正常将出现同时服务器端将现出注意:本文的读取方法是在服务器运行目录下的world.tif并在客户端的E盘生成一个world.tif文件传输数据量为8.16

1 / 9
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功