zoukankan      html  css  js  c++  java
  • 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.8gsoapinwin32下的soapcpp2.exe拷贝到add.h同一目录下。

         此处我的目录是E:ianchenggSoapTestgSoapTest  

         

        4)在控制台中跳转到add.h目录下,执行soapcpp2.exe add.h,最后会显示Compilation successful,代表执行成功

          

        此时E:ianchenggSoapTestgSoapTest该目录下回生成很多文件

        

    二、根据框架实现server端代码

      1、在gSoapTest解决方案下新建项目,项目名为server。此时,server所在目录为E:ianchenggSoapTestserver

        1)将E:ianchenggSoapTestgSoapTest下的文件add.nsmap,add.h,soapH.h,soapStub.h  soapC.cpp,soapServer.cpp以及

         gsoap-2.8gsoapinwin32目录下的stdsoap2.h,stdsoap2.cpp拷贝到server项目目录(E:ianchenggSoapTestserver)下。

        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> 
    ", 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
    ", 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
    ", 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:ianchenggSoapTestclient

        1)将E:ianchenggSoapTestgSoapTest下的文件add.nsmap,add.h,soapH.h,soapStub.h  soapC.cpp,soapClient.cpp以及

         gsoap-2.8gsoapinwin32目录下的stdsoap2.h,stdsoap2.cpp拷贝到client项目目录(E:ianchenggSoapTestclient)下。

        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 
    ", 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
    ", result);
        }
        else
        {
            printf("%d+%d=%d
    ", 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
    ", 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,如下,代表客户端访问服务端成功

      

      

       

  • 相关阅读:
    小白学习React官方文档看不懂怎么办?1.起步
    部分安卓机调用相册跟相机出问题了
    var与let与const
    小白学习React官方文档看不懂怎么办?3.元素渲染
    小白学习React官方文档看不懂怎么办?2.JSX语法
    jQuery简单面试题
    HTML页面插入图片,使用background还是img标签
    HTML规范
    img标签不能直接作为body的子元素
    java 学习第三天小练习
  • 原文地址:https://www.cnblogs.com/sunseine/p/4037529.html
Copyright © 2011-2022 走看看