首页 > 代码库 > windows下vs2012用gsoap开发webservice实例

windows下vs2012用gsoap开发webservice实例

零:说明

  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     else18     {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 }
View Code

 二、根据框架实现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;}
View Code

三、测试

  1、分别编译server、client

  

  2、启动server,并绑定访问端口号4567

  

  通过IE访问http://localhost:4567,如下,则服务端成功

  

  3、启动client,输入1 2,如下,代表客户端访问服务端成功

  

  

   

windows下vs2012用gsoap开发webservice实例