下篇將介紹在項目中怎麼使用gSoap。
1、下載gSoap。
gSoap下載地址:
http://sourceforge.net/projects/gsoap2/files/
下載好了會有一個名字爲gsoap_2.8.70.zip的壓縮包。
2、安裝gSoap。
【a】解壓gsoap_2.8.70.zip。
unzip gsoap_2.8.70
【b】進入解壓後生成的文件夾
cd gsoap-2.8/
【c】切換root用戶。
輸入命令:su root
輸入密碼
【d】配置編譯環境。
./configure --prefix=/usr/local/gSoap2.8
【e】編譯鏈接。
make
【f】 安裝。
make install
檢查/usr/local/下有沒有多一個gSoap2.8的目錄。
3、使用gsoap2.8。(demo)。
【a】編寫calc.h。
新建一個calc目錄。
mkdir calc
編寫calc.h。
vim calc.h
//gsoap ns service name: calc Simple ca lculator service
//gsoap ns service protocol: SOAP
//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
//gsoap ns service method: add Sums two values
int ns__add(double a, double b, double *result);
//gsoap ns service method: sub Subtracts two values
int ns__sub(double a, double b, double *result);
//gsoap ns service method: mul Multiplies two values
int ns__mul(double a, double b, double *result);
//gsoap ns service method: div Divides two values
int ns__div(double a, double b, double *result);
注意:
a、以上的幾行註釋中,gsoap ns service不能刪除,但可以修改
b、ns__add等的ns後面是兩個下劃線
【b】使用soapcpp2 生成相關文件。
soapcpp2的使用:
soapcpp2 [opt] 頭文件名
soapcpp2常用選項
-C 僅生成客戶端代碼
-S 僅生成服務器端代碼
-L 不要產生soapClientLib.c和soapServerLib.c文件
-c 產生純C代碼,否則是C++代碼(與頭文件有關)
-I 指定import路徑
-x 不要產生XML示例文件
-i 生成C++封裝(代理),客戶端爲xxxxProxy.h(.cpp),服務器端爲xxxxService.h(.cpp)。
本例是:/usr/local/gSoap2.8/bin/soapcpp2 -L -i -x calc.h
注:/usr/local/gSoap2.8/是安裝目錄。
/usr/local/gSoap2.8/bin/soapcpp2 -L -i -x calc.h
【c】編寫服務端代碼calcserver.cpp
#include "soapcalcService.h"
#include "calc.nsmap"
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
calcService calc;
int port = 8888;
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;
return SOAP_OK;
}
else
{
return SOAP_FAULT;
}
}
編寫好後將stdsoap2.h 複製到當前目錄下。
cp /usr/local/gSoap2.8/include/stdsoap2.h .
用以下命令進行服務端的編譯。
g++ calcserver.cpp soapcalcService.cpp soapC.cpp -o server -L/usr/local/gSoap2.8/lib/ -lgsoap++
編譯好後當前目錄下會出現server的可執行文件。
【d】編寫客戶端代碼calcclient.cpp
#include "soapcalcProxy.h"
#include "calc.nsmap"
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
double a = 520, b = 250, result;
calcProxy calc;
calc.soap_endpoint = "http://localhost:8888";
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;
return 0;
}
編譯客戶端代碼
g++ calcclient.cpp soapcalcProxy.cpp soapC.cpp -o client -L/usr/local/gSoap2.8/lib/ -lgsoap++
編譯完成後當前目錄下會出現client的可執行文件。
【e】測試。
./server &
./client
測試結果:
[root@192 calc]# ./client
520+250=770
520-250=270
520*250=130000
520/250=2.08