gsoap寫一個c++ webservice

由於對gsoap不熟。網上很多人都說,c++要調用webservice,可以用gsoap這個開源的開發包,於是就下載了gsoap,我下載的是2.8.3版本,是2011年6月25日release的。地址是http://sourceforge.net/projects/gsoap2/files/gSOAP/。現在的最新版是2.8.4,release時間是2011年10月22日。

下載,解壓,看一眼目錄結構:


接下來寫一個服務器端和客戶端都用C++的Demo,開發環境是VS2005。需要用到的是該目錄下的stdsoap2.cpp和stdsoap2.h兩個文件,bin/win32目錄下的soapcpp2.exe文件。這個Demo分爲Server端和Client端,以下是詳細的步驟:

[Server端]

用VS2005新建一個Win32控制檯應用程序,命名g_server,選擇空項目,其他默認即可。

添加一個server.cpp和server.h,在server.h中聲明一個函數int ns__add(int num1, int num2, int *sum);在server.cpp中添加main函數,build,ok到這一步沒啥問題。

將剛纔提到的bin/win32目錄下的soapcpp2.exe拷貝到server.h目錄下,打開cmd,進入當前目錄,敲入命令soapcpp2.exe server.h,回車:

可以看到當前目錄下生成了以下文件:

我將這些文件拷貝一份保存到bak文件夾,以防萬一改錯,可以從備份中拿最初的文件。

這些文件留取備用。

然後將剛纔提到的stdsoap2.cpp和stdsoap2.h兩個文件拷貝到源文件所在的目錄。將soapC.cpp,soapServer.cpp,stdsoap2.cpp加入到項目中,將soapH.h,soapStub.h,stdsoap2.h加入到項目中。在server.cpp中包含頭文件ns.nsmap(該文件是剛纔自動生成的一個,網上有些朋友是包含soapStub.h但是我發現這樣編譯會報錯,不知道是爲什麼)。

接下去將ns__add()函數定義完成,並編寫完main函數。Server端就完成了。

Main函數中的代碼是:

int nPort = 8080;

struct soap fun_soap;

soap_init(&fun_soap);

int nMaster = (int)soap_bind(&fun_soap, NULL, nPort, 100);

if (nMaster < 0)

{

soap_print_fault(&fun_soap, stderr);

exit(-1);

}

fprintf(stderr, "Socket connection successful : master socket = %d\n", nMaster);

while (true)

{

int nSlave = (int)soap_accept(&fun_soap);

if (nSlave < 0)

{

soap_print_fault(&fun_soap, stderr);

exit(-1);

}

fprintf(stderr, "Socket connection successful : slave socket = %d\n", nSlave);

soap_serve(&fun_soap);

soap_end(&fun_soap);

}

項目結構是:

編譯,成功。按Ctrl+F5運行,可以看到:

說明服務已成功啓動。驗證以下,在瀏覽器中輸入http://localhost:8080,回車,如果看到

說明服務器真的成功啓動!~~~先YY開心一下。喝杯咖啡。

[Client 端]

Client端稍微簡單一點。首先打開VS2005,新建一個Win32控制檯應用程序,空項目。加入client.cpp和client.h,在client.cpp中寫main函數,build一下,ok

將剛纔備份的文件全部拷貝到當前項目源文件所在目錄下。

將soapH.h,soapStub.h,stdsoap2.h加入到頭文件,將soapC.cpp,soapClient.cpp,stdsoap2.cpp加入當源文件。

同樣在client.cpp中包含頭文件#include "ns.nsmap"

編寫main函數和TestAdd函數:

int TestAdd(const char* server)

{

struct soap add_soap;

int nResult = 0;

soap_init(&add_soap);

int nNum1 = 20;

int nNum2 = 10;

int nSum = 0;

soap_call_ns__add(&add_soap, server, "", nNum1, nNum2, &nSum);

if (add_soap.error)

{

soap_print_fault(&add_soap, stderr);

}

soap_end(&add_soap);

soap_done(&add_soap);

return nSum;

}

int main()

{

char* server = "http://127.0.0.1:8080";

int result = TestAdd(server);

cout << "TestAdd result=" << result << endl;

return 0;

}

項目結構如下:

Build,按Ctrl+F5,運行,結果如下:

Server端看到的結果:

最後 需要注意的一點 就是Server需要設置附加庫wsock32.lib,因爲webservice底層是用socket通訊的。

發現CSDN好像只能上傳圖片,不能上傳rar壓縮包,所以源代碼也沒辦法在這裏分享,如果有需要的,可以留下Email或者聯繫我,
我的Email: [email protected]
MSN:           [email protected]
QQ:             372760564

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章