Linux使用gsoap

一、安装gsoap

在Terminal下执行apt-get install gsoap

二、编写calc.h文件
a、新建一个文件夹calc
ubuntu下右键新建或者命令行: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

注:如果make提示“ *** missing separator.  Stop.”就在提示的位置前加入tab键
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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值