Linux下gSOAP的使用


摘自: http://www.svnclub.com/?q=node/416
1、下載gSOAP 在gSOAP官網中可以找到最新的gSOAP安裝包以及相關的文檔 gSOAP官網:http://www.cs.fsu.edu/~engelen/soap.html gSOAP下載地址:http://sourceforge.net/projects/gsoap2/ 2、安裝gSOAP a、解壓zip壓縮包 命令:unzip gsoap_2.7.17.zip b、進入解壓后生成的文件夾gsoap-2.7 命令:cd gsoap-2.7/ c、切換到root用戶 命令:su 輸入密碼 d、配置編譯環境 在gsoap-2.7/文件夾下有一個configure文件,執行它,自動配置編譯環境 命令:./configure e、編譯連接 命令:make f、安裝gSOAP 命令:make install 可用wsdl2h或者soapcpp2查看gSOAP是否已經安裝成功 用命令whereis gsoap查看gSOAP安裝到的位置 3、編寫calc.h文件 a、新建一個文件夾calc 命令:mkdir calc b、進入calc 命令:cd calc c、創建文件calc.h,在文件中寫入以下內容,保存 //gsoap ns service name: calc Simple calculator service //gsoap ns service style: rpc //gsoap ns service encoding: encoded //gsoap ns service namespace: http://localhost/calc.wsdl //gsoap ns service location: http://localhost/server.cgi //gsoap ns schema namespace: urn:calc int ns__add(double a, double b, double *result); int ns__sub(double a, double b, double *result); int ns__mul(double a, double b, double *result); int ns__div(double a, double b, double *result); int ns__pow(double a, double b, double *result); 注意: a、以上的幾行注釋中,gsoap ns service不能刪除,但可以修改 b、ns__add等的ns后面是兩個下划線 4、調用soapcpp2自動生成相關的文件 (為了方便代碼管理,在calc文件夾下新建一個soap) 當前工作目錄為calc/soap 命令:soapcpp2 -i ../calc.h 注意: 可能會報錯,一般是不知道gsoap相關include文件的位置,可以使用 命令soapcpp2 -i ../calc.h -I /usr/include/gsoap 5、編寫服務器端代碼:server.cpp 當前工作目錄:calc #include "soap/soapcalcService.h" #include <iostream> using namespace std; int main(int argc, char **argv) { calcService calc; int port = 65531; if (calc.run(port)) { cerr << "Calc service run failed" << endl; exit(0); } return 0; } int calcService::add(double a, double b, double* result) { *result = a + b; return SOAP_OK; } int calcService::sub(double a, double b, double* result) { *result = a - b; return SOAP_OK; } int calcService::mul(double a, double b, double* result) { *result = a * b; return SOAP_OK; } int calcService::div(double a, double b, double* result) { if (b) { *result = a / b; } else { return SOAP_FAULT; } return SOAP_OK; } int calcService::pow(double a, double b, double *result) { *result = ::pow(a, b); if (soap_errno == EDOM) { char *s = (char*) soap_malloc(this, 1024); sprintf(s, "Can't take the power of %f to %f", a, b); sprintf(s,"<error xmlns=\"http://tempuri.org/\">Can't take power of %f to %f</error>",a, b); return SOAP_FAULT; } return SOAP_OK; } 6、編寫客戶端代碼:client.cpp #include "soap/soapcalcProxy.h" #include "soap/calc.nsmap" #include <iostream> using namespace std; int main(int argc, char **argv) { double a = 4; double b = 2; double result; calcProxy calc; calc.soap_endpoint = "http://localhost:65531"; calc.add(a,b,&result); cout<<a<<"+"<<b<<"="<<result<<endl; calc.sub(a,b,&result); cout<<a<<"-"<<b<<"="<<result<<endl; calc.mul(a,b,&result); cout<<a<<"*"<<b<<"="<<result<<endl; calc.div(a,b,&result); cout<<a<<"/"<<b<<"="<<result<<endl; calc.pow(a,b,&result); cout<<a<<"^"<<b<<"="<<result<<endl; return 0; } 7、編寫Makefile文件:makefile、sources.mk、subdir.mk、soap/subdir.mk、objects.mk 新建bin文件夾 當前工作目錄:calc/bin #文件:makefile RM := rm -rf # 引入相關的生成文件 -include sources.mk -include subdir.mk -include soap/subdir.mk -include objects.mk ifneq ($(MAKECMDGOALS),clean) ifneq ($(strip $(C++_DEPS)),) -include $(C++_DEPS) endif ifneq ($(strip $(C_DEPS)),) -include $(C_DEPS) endif ifneq ($(strip $(CC_DEPS)),) -include $(CC_DEPS) endif ifneq ($(strip $(SERVER_CPP_DEPS)),) -include $(SERVER_CPP_DEPS) endif ifneq ($(strip $(CLIENT_CPP_DEPS)),) -include $(CLIENT_CPP_DEPS) endif ifneq ($(strip $(CXX_DEPS)),) -include $(CXX_DEPS) endif ifneq ($(strip $(C_UPPER_DEPS)),) -include $(C_UPPER_DEPS) endif endif # 生成目標 all: server client # 相關工具 server: $(SERVER_OBJS) $(USER_OBJS) @echo '創建目標: $@' g++ -o"server" $(SERVER_OBJS) $(USER_OBJS) $(LIBS) @echo '完成創建目標: $@' @echo "\n" client: $(CLIENT_OBJS) $(USER_OBJS) @echo '創建目標: $@' g++ -o"client" $(CLIENT_OBJS) $(USER_OBJS) $(LIBS) @echo '完成創建目標: $@' @echo "\n" # 清空臨時文件 clean: -$(RM) $(SERVER_OBJS)$(CLIENT_OBJS)$(C++_DEPS)$(C_DEPS)$(CC_DEPS)$(SERVER_CPP_DEPS)$(CLIENT_CPP_DEPS)$(EXECUTABLES)$(CXX_DEPS)$(C_UPPER_DEPS) -@echo "\n" cleanall: -$(RM) $(SERVER_OBJS)$(CLIENT_OBJS)$(C++_DEPS)$(C_DEPS)$(CC_DEPS)$(SERVER_CPP_DEPS)$(CLIENT_CPP_DEPS)$(EXECUTABLES)$(CXX_DEPS)$(C_UPPER_DEPS) server client -@echo "\n" cleanexe: -$(RM) server client -@echo "\n" .PHONY: all clean dependents cleanall cleanexe ===================================================================================================== #文件:sources.mk O_SRCS := SERVER_CPP_SRCS := CLIENT_CPP_SRCS := C_UPPER_SRCS := C_SRCS := S_UPPER_SRCS := OBJ_SRCS := ASM_SRCS := CXX_SRCS := C++_SRCS := CC_SRCS := SERVER_OBJS := CLIENT_OBJS := C++_DEPS := C_DEPS := CC_DEPS := SERVER_CPP_DEPS := CLIENT_CPP_SRCS := EXECUTABLES := CXX_DEPS := C_UPPER_DEPS := # 子目錄 SUBDIRS := \ soap \ . \ ===================================================================================================== #文件:sources.mk O_SRCS := SERVER_CPP_SRCS := CLIENT_CPP_SRCS := C_UPPER_SRCS := C_SRCS := S_UPPER_SRCS := OBJ_SRCS := ASM_SRCS := CXX_SRCS := C++_SRCS := CC_SRCS := SERVER_OBJS := CLIENT_OBJS := C++_DEPS := C_DEPS := CC_DEPS := SERVER_CPP_DEPS := CLIENT_CPP_SRCS := EXECUTABLES := CXX_DEPS := C_UPPER_DEPS := # 子目錄 SUBDIRS := \ soap \ . \ ===================================================================================================== #文件:subdir.mk # 生成的相關參數 SERVER_CPP_SRCS += \ ../server.cpp SERVER_OBJS += \ ./server.o SERVER_CPP_DEPS += \ ./server.d CLIENT_CPP_SRCS += \ ../client.cpp CLIENT_OBJS += \ ./client.o CLIENT_CPP_DEPS += \ ./client.d # 根據.cpp文件生成.o文件 %.o: ../%.cpp @echo '創建目標: $<' g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -o"$@" "$<" @echo '完成創建目標: $<' @echo "\n" ===================================================================================================== #文件:soap/subdir.mk # 生成的相關參數 SERVER_CPP_SRCS += \ ../soap/soapC.cpp \ ../soap/soapcalcService.cpp \ /usr/include/gsoap/stdsoap2.cpp SERVER_OBJS += \ ./soap/soapC.o \ ./soap/soapcalcService.o \ ./soap/stdsoap2.o SERVER_CPP_DEPS += \ ./soap/soapC.d \ ./soap/soapcalcService.d \ ./soap/stdsoap2.d CLIENT_CPP_SRCS += \ ../soap/soapC.cpp \ ../soap/soapcalcProxy.cpp \ /usr/include/gsoap/stdsoap2.cpp CLIENT_OBJS += \ ./soap/soapC.o \ ./soap/soapcalcProxy.o \ ./soap/stdsoap2.o CLIENT_CPP_DEPS += \ ./soap/soapC.d \ ./soap/soapcalcProxy.d \ ./soap/stdsoap2.d # 根據.cpp文件生成.o文件 soap/%.o: ../soap/%.cpp @echo '創建目標: $<' g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -o"$@" "$<" @echo '完成創建目標: $<' @echo "\n" soap/%.o:/usr/include/gsoap/%.cpp @echo '創建目標: $<' g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -o"$@" "$<" @echo '完成創建目標: $<' @echo "\n" ===================================================================================================== #文件:objects.mk USER_OBJS := LIBS := 8、編譯 當前工作目錄:calc/bin make 9、開啟服務端 ./server 10、開啟客戶端 ./client 11、文件總覽(3個目錄, 42個文件) calc // 根目錄 |-- bin // 文件夾,存放makefile,以及生成的.o、.d、可執行文件 | |-- client | |-- client.d | |-- client.o | |-- makefile | |-- objects.mk | |-- server | |-- server.d | |-- server.o | |-- soap | | |-- soapcalcProxy.d | | |-- soapcalcProxy.o | | |-- soapcalcService.d | | |-- soapcalcService.o | | |-- soapC.d | | |-- soapC.o | | |-- stdsoap2.d | | |-- stdsoap2.o | | `-- subdir.mk | |-- sources.mk | `-- subdir.mk |-- calc.h // calc.h |-- client.cpp // 客戶端 |-- server.cpp // 服務器端 `-- soap // 該文件夾存放命令soapcpp2 -i ../calc.h生成的文件 |-- calc.add.req.xml |-- calc.add.res.xml |-- calc.div.req.xml |-- calc.div.res.xml |-- calc.mul.req.xml |-- calc.mul.res.xml |-- calc.nsmap |-- calc.pow.req.xml |-- calc.pow.res.xml |-- calc.sub.req.xml |-- calc.sub.res.xml |-- calc.wsdl |-- ns.xsd |-- soapcalcProxy.cpp |-- soapcalcProxy.h |-- soapcalcService.cpp |-- soapcalcService.h |-- soapC.cpp |-- soapH.h `-- soapStub.h


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM