gsoap入门指引

C/C++想使用WebService,那么非常好的一个选择就是gsoap,本文档针对gsoap的入门,对深入的层面不进行过多的探讨,关于WebService的概念和gsoap高级应用,会另外有文档涉及。

gsoap在网上的资料比较少,我猜想可能的原因是gsoap在应用中大多使用Java或者.net,而C/C++使用的比较少。多余的话就不赘述了。现在开始。

gsoap下载:SourceForge.net

下载后,在LinuxWindows下的安装使用就不多赘述了。只要有一点关于开源软件的使用经验就足够了。

gsoap主要的应用程序分为两个:wsdl2hsoapcpp2

wsdl2h是将wsdl定义转换成.h文件的工具。主要有一些选项:

-c代表转化成C代码。

-s代表不使用STL,取而代之需要在工程中包含stdsoap2.hstdsoap2.cpp。这些在安装的源码中都可以找到。

-o file代表指定输出文件名称。

通常情况下使用命令wsdl2h –s xxx.wsdl即可生成想要的.h文件。

 

soapcpp2是生成源码的工具,从某种意义上来说,WebServiceICE相当的相像。都是网络通信协议的封装方式,所不同的是WebService使用的是公开协议。没有特殊选项的情况下,gsoap不需要依赖其他的链接库。soapcpp2的主要选项有:

-S代表生成客户端代码。

-C代表生成服务端代码。

-L代表不生成soapClientLib/soapServerLib

-c代表仅生成c代码

-i代表使用Proxy

通常情况下使用命令soapcpp2 –S/-C –L -i xxx.h

 

在编写客户端的时候,比较简单,分成两种方式:使用Proxy的方式相对来说,比较简单,Demo源码如下:

#include <iostream>

#include "soapcurrentTimeProxy.h"

#include "currentTime.nsmap"

using namespace std;

int main() {

        cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!

        currentTimeProxy currentTime;

        int nRet=0;

        if(currentTime.currentTime(10,&nRet) == SOAP_OK)

                printf("Return %d/n",nRet);

        else

                currentTime.soap_stream_fault(std::cerr);

        return 0;

}

有几个地方需要注意:

1.       需要包含XXX.nsmap文件,这非常重要,这是表示WebService的语义所在。

2.       这个Demo是使用Proxy的调用方式,即在soapcpp2使用了-i这个参数。

3.       如果使用了wsdl2h –s参数,需要包含stdsoap2.hstdsoap2.cpp

4.       请不要包含soapClientLib/soapServerLib

Client端使用非Proxy的方式省略,这在网上到处都是,需要关注的点差不多。另外关于WebService访问地址的问题。在正常情况下,WebService地址在wsdl中指定。但除了这种方式,还可以使用指定Serveripport的方式,在soap有个成员变量endpoint,填写这个参数就可以。

编成服务端的情况稍微多一点,之所以这样说,可以把WebService的服务端分成两种调用方式:一种是使用gsoap来做Http Server;另外一种使用httpd或者其他的东西来做HttpServer,而gsoap作为cgi

Demo如下:

#include "soaptest2PortBindingObject.h"

#include "test2PortBinding.nsmap"

#include <iostream>

 

using namespace std;

int main() {

        cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!

        struct soap soap;

        int m, s; // master and slave sockets

        soap_init(&soap);

        m = soap_bind(&soap, "10.130.15.133", 80, 100);

        if (m < 0)

                soap_print_fault(&soap, stderr);

        else

        {

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

                for (int i = 1; ; i++)

                {

                        s = soap_accept(&soap);

                        if (s < 0)

                        {

                                soap_print_fault(&soap, stderr);

                                break;

                       }

                        fprintf(stderr, "%d: accepted connection from IP=%d.%d.%d.%d socket=%d/n", i,(soap.ip>>24)&0xFF, (soap.ip>>16)&0xFF, (soap.ip>>8)&0xFF, soap.ip&0xFF, s);

                        if (soap_serve(&soap) != SOAP_OK) // process RPC request

                                soap_print_fault(&soap, stderr); // print error

                        fprintf(stderr, "request served/n");

                        soap_destroy(&soap); // clean up class instances

                        soap_end(&soap); // clean up everything and close socket

                }

        }    

        return 0;

}       

Client不同的是,这里没有使用Proxy方式,这里省略了两个需要实现的接口函数。从接口调用来分析Bind是启动httpServer的端口监听。而accept是接受WebService请求。Serve是提供WebService服务。这是使用gsoap自己作为httpServer,这个程序起来的时候,就会在循环中不断接受请求,然后提供服务,也就是说这个程序是一直启动的,并在循环中提供服务。这个一个单线程的程序,也就是说,同时只能处理一个请求,在效率上不是最佳的。那么有两种方式可以处理,一是使用多线程来调用Serve;二是使用httpd来作为httpServer。下面就是这样一个Demo:

int main()

{

// create soap context and serve one CGI-based request:

        soap_serve(soap_new());

}

非常简单,一次调用就执行一次程序。相当于使用多进程来处理并发请求。而调度器是httpd。将这个程序放在httpdcgi空间中就可以了。

最后的提示,不要轻易定义什么编译宏。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
带gsoap-2.8源码,基于服务器客户端的实例,带自动生成服务客户端代码的批处理程序,及如何使用。带自己学习参考的教程; 0.解压附件,soapInterface.bat所在路径不得含中文 空格 1.新建头文件 取soapInterface.bat文件的同名:soapInterface.h 文件内编写接口,具体说明看附件参考的教程 //gsoap ns service name: gservice //gsoap ns service style: rpc int ns__add(int num1, int num2, int* result ); int ns__sub(int num1, int num2, int* result ); int ns__mult( int num1, int num2, int *result); int ns__divid( int num1, int num2, int *result); 2.从附件内gsoap-2.8包中搜索复制stdsoap2.h,stdsoap2.cpp,soapcpp2.exe, 存放于soapInterface.bat同级目录 3.双击soapInterface.bat运行。生成gClientSoap,gServerSoap两个文件夹,分别复制到服务器工程与客户端工程中使用 4.gClientSoap,gServerSoap两个文件夹内用到的文件功能说明,更多参考附件教程 1)soapC.cpp , soapH.h//soap的序列和反序列代码,它已经包含了soapStub.h 2)soapServer.c ppsoapServerLib.cpp //服务器端代码(纯C代码是soapServer.c soapServerLib.c ),soapServerLib.cpp文件则只是简单地包含soapServer.cpp和soapC.cpp 3)soapClient.cpp soapClientLib.cpp//客户端代码(纯C代码是soapClient.csoapClientLib.c ),soapClientLib.cpp文件则只是简单地包含soapClient.cpp和soapC.cpp 4) soapStub.h // soap的存根文件,定义了我们编写的头文件里对应的远程调用模型 5) add.nsmap //XML服务命名空间 6)服务器端要载入的文件有:soapServer.cpp,soapC.cpp,stdsoap2.cpp; 要包含的文件有:gservice.nsmap,soapH.h; 客户端要输入的文件有: soapClient.cpp,soapC.cpp,stdsoap2.cpp; 要包含的文件有:gservice.nsmap,soapH.h

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值