推广 热搜: csgo  vue  angelababy  2023  gps  新车  htc  落地  app  p2p 

用c++实现webservice服务

   2023-08-24 网络整理佚名1230
核心提示:绝大多数的C++web服务工具包提供一组API函数类库来处理特定的SOAP数据结构,这样就使得用户必须改变程序结构来适应相关的类库。h的工具,这里我们不介绍wsdl文件如何编写,也不介绍wsdl转h功能,因为我们自己已经写好的.(2)、输入条件为一个或多个wsdl或xsd文件或者相应的URL路径,如果输入wsdl或xsd则输出为第一个名称的.生成对象为soap的子类,会影响生成文件的使用方法。

最近在学习onvif摄像头相关的协议,然后就开始学习服务,然后整理了一下自己的理解,参考了一些网上的教程来实现服务。

介绍

首先我们来说说为什么我们需要学习这样的技术……

问题一

如果我们的网站需要提供天气预报,我们该怎么办? ? ? ? ?

像天气预报这样的功能是无法通过简单的JS组件实现的。 它的数据取决于数据库的分析,甚至需要卫星探测……我们不可能亲自建立这样的数据库。

那么既然我们自己做不到,那我们可以去找别人吗? ? ? 我们从搜索引擎搜索,可以找到很多提供天气预报的网站,但是它返回的是一个网页,而我们只需要相应的数据!

我们可能会想,难道我们只想要它返回的数据,而不是处理后返回的网页吗? ?

于是乎,它就诞生了,它部署在Web服务器上,并且暴露了一个可以通过Web向外界调用的API。 也就是说:当我们想要获取天气预报信息的时候,我们可以调用别人写的服务,调用之后就可以得到结果了!

问题二

然而,我们编写主流网站的平台有以下几种:Java、.net、PHP等,那么部署在Web服务器上的服务器如何才能被我们不同的平台调用呢? ?

我们知道java、.net等平台其语言中可能存在不同的基本数据类型和复杂数据类型,那么如何实现调用呢? ? ?

引用一段话

当你写一个应用程序来查询数据库时,你没有考虑过为什么查询结果可以返回给上层应用程序。 你甚至认为这就是数据库应该做的事情。 事实上,事实并非如此。 这是数据库和另一个应用程序之间通过 TCP/IP 协议进行的连接。 由于是程序通信,数据库本身并不知道上层使用什么样的应用程序,使用什么语言。 它只知道自己收到了一个协议,就是SQL92查询标准协议。

不管是Java、.net、PHP等平台,只要是Web开发,都可以通过http协议进行通信,并且如果返回的数据是通用的,那么我们就学会了这样的技术【XML】

所以webservice实际上就是http+XML

正确的理解

,顾名思义,是一种基于 Web 的服务。 它使用Web(HTTP)方法来接收和响应来自外部系统的某些请求。 这可以实现远程调用。

我们可以调用互联网上的天气信息Web服务,然后将其嵌入到我们的程序中(C/S或B/S程序)。 当用户从我们的网站上看到天气信息时,他会认为我们提供了很多信息服务,但实际上我们什么也没做,只是简单地调用了服务器上的一段代码。

学习可以把你的服务(一段代码)发布到网上供别人调用,也可以调用发布在别人机器上的服务,就像使用自己的代码一样。

相关术语 名词2:WSDL——Web服务描述语言。 名词 3:SOAP-(简单对象访问协议)

对于c++来说,我们发布服务,也是有库支持的,那就是gsoap,我使用的gsoap的版本是

GSoap是一个开源工具,功能非常强大。 大家可以在网上搜索学习看看这个好工具。 gSOAP编译工具提供了C/C++语言的SOAP/XML实现,使得C/C++语言开发web服务或者客户端程序的工作变得容易很多。 大多数C++ Web服务工具包都提供了一组API函数类库来处理特定的SOAP数据结构,这使得用户不得不更改程序结构以适应相关的类库。 这里我主要通过C/S模式调用GSOAP来实现服务端和客户端。 首先,我的目标是提供一组简单的数学接口:加、减、乘、除四个接口。

在使用GSOAP提供的几个接口之前,我们先来熟悉一下GSOAP中自带的两个工具:.exe和.exe。 这两个工具可以在.8.29下载(可以去开源社区下载:)在 gsoap/ bin/win32 目录下找到。 当然,这是gsoap提供的两个直接工具。 我们先来认识一下这两个简单易用的工具:

工具:就像它的名字wsdl to h一样,就是将(.wsdl文件)转换为.h的头文件工具,换句话说,它是一个转换为.h的工具。 这里我们不会介绍如何编写wsdl文件,也不会介绍wsdl转h函数,因为我们已经写好了.h文件。 如果你想了解的话,请去onvif官网下载相关的wsdl,用这个工具试试吧! 具体功能如下:

(1)、它只负责生成wsdl中描述的相应头文件,这些头文件不能直接使用,只能将.exe转换为gsoap生成的接口后才能使用

(2)。 输入条件为一个或多个wsdl或xsd文件或对应的URL路径。 如果输入 wsdl 或 xsd,则输出将是第一个名称的 .h 文件。 如果是URL,则默认为标准输出

携带参数:

-s:不使用STL代码即不使用标准模板库。 如果不使用-s参数,则默认使用STL库,即必须将./gsoap/.h和.cpp文件复制到应用程序中。 。

-c:C代码c表示生成c文件接口,默认是c++头文件

-o:to file指定输出文件名,可以重命名生成的文件名

-t:使用文件.dat的类型映射文件 使用类型定义文件,可以修改.dat(内置)中的生成选项,生成符合要求的头文件,例如编码

当然,这个工具中还使用了其他n个参数。 这里只介绍几个常用的,其他控制参数请自行了解。

.exe:这个工具的作用就是把我们提供的或者生成的.h头文件(接口)转换成gsoap提供的接口以及rpc代理相关的代码和框架(当然具体我没知道) ,可以在vs中搜索其他有对应接口名称并有对应实现的代理方法)

相关参数如下:

(1)、-1生成SOAP1.1协议的代码

(2),-2 生成SOAP1.2协议代码

(3)、-C 只生成客户端相关的代码

(4)、-S 只是生成服务器相关的代码

(5)、--C++与soap 生成的对象是soap的子类,会影响生成文件的使用。 如类:香皂

其他参数这里不再介绍。 如果需要更详细的解释,请前往官网查看相应工具的介绍。

好了,学会了这两个工具之后,我们就可以使用上面的工具了。 当然,我们这里不需要工具,因为我们是C++程序员。 我们可以自己编写并提供头文件。 我们不需要编写 wsdl 来转换为 . h 文件省去了很多麻烦。 我们可以直接使用该工具将头文件转换为对应的头文件。 首先,服务端提供加减乘除4个接口,客户端调用加减乘除4个接口。 约定的接口如下:

int Add(int nNum1, int nNum2, int* );

int Sub(int nNum1, int nNum2, int* );

int Mul(int nNum1, int nNum2, int*);

int Div(int nNum1, int nNum2, int* );

我们以参数地址的形式提供返回值,而不是以函数返回值的形式。 和gsoap生成的接口有关。 它生成接口调用的时候,返回值表示传入的参数是否正确或者调用成功时使用的返回值,所以我们自己的接口为了不覆盖它的使用,就这么写的,当然,形式变了,没关系! 由于客户端和服务端都使用这4个接口作为通信接口,因此将这4个接口作为我们要转换为gsoap代理或框架的头文件的声明,新建一个服务端程序,并新建一个win32项目:清空项目,添加一个类,然后删除该类的所有声明和实现(目的是使用.h和.cpp两个配对文件,不需要对应的类),并在.h中声明上述函数:

#一次

int Add(int nNum1, int nNum2, int* );

int Sub(int nNum1, int nNum2, int* );

int Mul(int nNum1, int nNum2, int*);

int Div(int nNum1, int nNum2, int* );

在.cpp中添加main函数

# “。H”

int main(int argc, char** argv)

0;

编译项目并确保编译通过且无错误。 接下来查看.8工具目录下的./gsoap/bin/win32/.exe,将其复制到与.h同一目录下。 使用命令行cmd进入该目录

喜欢:

类型:cd E://C++/test//

类型:E:

使用.exe:.exe .h

这时,由于我们没有指定-C或-S,所以它会为我们生成客户端和服务端的所有代码。 如果我们只生成客户端代码,添加-C参数,soapH.c,soapC.cpp,. h、.cpp .cpp代码(添加我们的stl库.h和.cpp共7个文件,当然包括传输的.h文件为8个,这里生成后是否要.h并不重要); 如果只想生成服务器端代码,则添加-S参数,此时会生成soapH.c、soapC.cpp、.h、.cpp.cpp和soap.nsmap文件,即8文件(不包括正在转换的.h头文件)

其中soap.h和soapC.cpp是具体实现,.h是代理的声明(我们需要实现服务器端声明的4个接口——这4个接口和我们约定的不太一样,而第一个参数太多

肥皂 * 对象指针)

对于服务器端,我们将soap..cpp.h.cpp以及依赖的stl库.h和.cpp添加到项目中(.cpp不是必须的,否则会出现错误),添加完所有cpp属性后将预编译头设置为“不使用预编译头”,最后找到.h文件的最后几行,就会发现我们约定的接口声明(接口略有变化,多了soap*参数),将其复制到main函数之前的.cpp项目目录中,并实现:

int Add(soap*, int nNum1, int nNum2, int *)

* = nNum1 + nNum2;

;

int Sub(soap*, int nNum1, int nNum2, int *)

* = nNum1 - nNum2;

;

int Mul(soap*, int nNum1, int nNum2, int *)

* = nNum1 * nNum2;

;

int Div(soap*, int nNum1, int nNum2, int *)

if(0 == nNum2)

* = 0;

-1;

* = nNum1 / nNum2;

;

编译发现没有错误。 如果出现预编译错误,则设置cpp属性,去掉预编译头。 请记住,不需要 .cpp 生成的文件。 .cpp是必须的,它实现了服务,就是我们服务器提供的服务!

具体服务器主要功能实现如下:

#include "GSoapServer.h"
#include “soap.nsmap” // 服务端与客户端必须包含的文件

SOAP_FMAC5 int SOAP_FMAC6 Add(struct soap*, int nNum1, int nNum2, int *pResult)
{
    *pResult = nNum1 + nNum2;
    return SOAP_OK;
}

SOAP_FMAC5 int SOAP_FMAC6 Sub(struct soap*, int nNum1, int nNum2, int *pResult)
{
    *pResult = nNum1 - nNum2;
    return SOAP_OK;
}

SOAP_FMAC5 int SOAP_FMAC6 Mul(struct soap*, int nNum1, int nNum2, int *pResult)
{
    *pResult = nNum1 * nNum2;
    return SOAP_OK;
}

SOAP_FMAC5 int SOAP_FMAC6 Div(struct soap*, int nNum1, int nNum2, int *pResult)
{
    if(0 == nNum2)
    {
    *pResult = 0;
    return -1;
}
*pResult = nNum1 / nNum2;
return SOAP_OK;
}
int main(int argc, char**argv)
{
    struct soap math_service;
    soap_init(&math_service);
    // bind端口返回SOCKET套接字-雷同socket套接口函数服务器监听过程
if(soap_bind(&math_service, NULL, 8686, 100) <0)
{
    soap_print_fault(&math_service, stderr);
    return -1;
}
fprintf(stderr, "start math webservice ...\n");
// 当然这里可以用多个soap在多个现成中使用soap_new创建新的soap,每个线程一个
while(true)
{
    int nClient = (int)soap_accept(&math_service);
    if(nClient < 0)
    {
        soap_print_fault(&math_service, stderr);
        return -1;
    }
    fprintf(stderr, "client[%d] connect success. ..\n, nClient);
    soap_serve(&math_service);// provide service
    soap_end(&math_service);// end service
}
return 0;
}

启动服务器程序,打开IE并输入::8686/

你会发现IE返回:

 
反对 0举报 0 收藏 0 打赏 0评论 0
 
更多>同类资讯
推荐图文
推荐资讯
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报
Powered By DESTOON