摘自: 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