零:說明
1、本文是根據網上前人經驗結合自己動手操作寫成,開發工具用的vs2012,gsoap用的是gsoap-2.8;
2、gsoap提供的工具簡單介紹
1)wsdl2h.exe:根據WSDL文件生成頭文件。這個是別人發布了webservice服務,提供給我們WSDL文件,我們根據WSDL生成頭文件,進而實現我們的客 戶端。
2)soapcpp2.exe:根據頭文件生成調用遠程soap服務的客戶端框架和提供soap服務的服務端框架。如果我們要自己做server端,則需要自己寫頭文件, 根據頭文件,生成客戶端框架和服務端框架,在此框架中實現自己的服務。
一:根據頭文件用soapcpp2.exe生成框架代碼
0、該soap服務端是實現兩個整數相加,供遠程調用;
1、編寫頭文件
1)在vs中新建解決方案,名字為gSoapTest
![]()
2)在項目gSoapTest下新建頭文件,名字為add.h

頭文件代碼:
//gsoap ns service name: add //gsoap ns service namespace: http://localhost/add.wsdl //gsoap ns service location: http://localhost //gsoap ns service executable: add.cgi //gsoap ns service encoding: encoded //gsoap ns schema namespace: urn:add int ns__add( int num1, int num2, int* sum );
3)將gsoap安裝目錄下的\gsoap-2.8\gsoap\bin\win32下的soapcpp2.exe拷貝到add.h同一目錄下。
此處我的目錄是E:\biancheng\gSoapTest\gSoapTest

4)在控制台中跳轉到add.h目錄下,執行soapcpp2.exe add.h,最后會顯示Compilation successful,代表執行成功

此時E:\biancheng\gSoapTest\gSoapTest該目錄下回生成很多文件

二、根據框架實現server端代碼
1、在gSoapTest解決方案下新建項目,項目名為server。此時,server所在目錄為E:\biancheng\gSoapTest\server
1)將E:\biancheng\gSoapTest\gSoapTest下的文件add.nsmap,add.h,soapH.h,soapStub.h soapC.cpp,soapServer.cpp以及
\gsoap-2.8\gsoap\bin\win32目錄下的stdsoap2.h,stdsoap2.cpp拷貝到server項目目錄(E:\biancheng\gSoapTest\server)下。
2)將add.nsmap,add.h,soapH.h,soapStub.h,stdsoap2.h添加到項目server頭文件中。
3)將soapC.cpp,soapServer.cpp,stdsoap2.cpp添加到項目server源文件中。
4)在項目server源文件中新建源文件,名字為server.cpp

5)將wsock32.lib庫添加到server項目中
右鍵server->屬性->配置屬性->連接器->輸入->附加依賴項,在附加依賴項中添加wsock32.lib

6)編寫server.cpp代碼
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include "stdsoap2.h" 4 #include "add.h" 5 #include "add.nsmap" 6 int main(int argc, char* argv[]) 7 { 8 int m, s; 9 struct soap add_soap; 10 soap_init(&add_soap); 11 //soap_set_namespaces(&add_soap, add_namespaces); 12 if (argc < 2) 13 { 14 printf("usage: %s <server_port> \n", argv[0]); 15 exit(1); 16 } 17 else 18 { 19 m = soap_bind(&add_soap, NULL, atoi(argv[1]), 100); 20 if (m < 0) 21 { 22 soap_print_fault(&add_soap, stderr); 23 exit(-1); 24 } 25 fprintf(stderr, "Socket connection successful: master socket = %d\n", m); 26 for ( ; ; ) 27 { 28 s = soap_accept(&add_soap); 29 if (s < 0) 30 { 31 soap_print_fault(&add_soap, stderr); 32 exit(-1); 33 } 34 fprintf(stderr, "Socket connection successful: slave socket = %d\n", s); 35 soap_serve(&add_soap);//該句說明該server的服務 36 soap_end(&add_soap); 37 } 38 } 39 return 0; 40 } 41 42 //server端的實現函數與add.h中聲明的函數相同,但是多了一個當前的soap連接的參數 43 44 int ns__add(struct soap *add_soap, int num1, int num2, int *sum) 45 { 46 *sum = num1 + num2; 47 return 0; 48 }
二、根據框架實現client端代碼
1、在解決方案gSoapTest中新建項目,名字為client。此時,server所在目錄為E:\biancheng\gSoapTest\client
1)將E:\biancheng\gSoapTest\gSoapTest下的文件add.nsmap,add.h,soapH.h,soapStub.h soapC.cpp,soapClient.cpp以及
\gsoap-2.8\gsoap\bin\win32目錄下的stdsoap2.h,stdsoap2.cpp拷貝到client項目目錄(E:\biancheng\gSoapTest\client)下。
2)將add.nsmap,add.h,soapH.h,soapStub.h,stdsoap2.h添加到項目client頭文件中。
3)將soapC.cpp,soapClient.cpp,stdsoap2.cpp添加到項目client源文件中。
4)在項目server源文件中新建源文件,名字為client.cpp

5)編寫clent.cpp代碼
#include <stdio.h> #include <stdlib.h> #include "stdsoap2.h" #include "soapH.h" #include "add.nsmap" int add(const char* server, int num1, int num2, int *sum); int main(int argc, char **argv) { int result = -1; char* server="http://localhost:4567"; int num1 = 0; int num2 = 0; int sum = 0; if( argc < 3 ) { printf("usage: %s num1 num2 \n", argv[0]); exit(0); } num1 = atoi(argv[1]); num2 = atoi(argv[2]); result = add(server, num1, num2, &sum); if (result != 0) { printf("soap err,errcode = %d\n", result); } else { printf("%d+%d=%d\n", num1, num2, sum ); } return 0; } int add(const char* server, int num1, int num2, int *sum) { struct soap add_soap; int result = 0; soap_init(&add_soap); // soap_set_namespaces(&add_soap, add_namespaces); //該函數是客戶端調用的主要函數,后面幾個參數和add.h中聲明的一樣,前面多了3個參數,函數名是接口函數名ns__add前面加上 //soap_call_ soap_call_ns__add( &add_soap, server, "", num1, num2, sum ); if(add_soap.error) { printf("soap error:%d,%s,%s\n", add_soap.error, *soap_faultcode(&add_soap), *soap_faultstring(&add_soap) ); result = add_soap.error; } soap_end(&add_soap); soap_done(&add_soap); return result; }
三、測試
1、分別編譯server、client

2、啟動server,並綁定訪問端口號4567

通過IE訪問http://localhost:4567,如下,則服務端成功

3、啟動client,輸入1 2,如下,代表客戶端訪問服務端成功

