C++ 开发SOAP服务端和SOAP客户端

作者:flyfish  2012-5-12

目的:利用gSOAP自带的Calc例子 仿写一个 网络中使用计算器

客户端通过http发送xml格式的数据请求,服务端计算完之后,将结果以xml格式返回给客户端。

编写之后 我们的服务端可独立使用。像在安装了IIS或者用Apache配置的Web服务器。

gSoap版本 2.8.8

编译环境为 winXP+VC6

soapcpp2.exe和wsdl2h.exe这两个文件的目录是

gsoap_2.8.8\gsoap-2.8\gsoap\bin\win32路径

生成服务端文件命令 soapcpp2.exe -S -i -T calc.h文件的路径

生成客户端文件命令 soapcpp2.exe -C -i calc.h文件的路径

-S的含义是生成服务端代码

-C 的含义是生成客户端代码

-T 生成一个测试例子,我们可以仿照这个例子编写自己的程序

-i从SOAP结构生成服务代理和继承的对象

服务端编写

用vc新建一个win32控制台的工程名字叫ServerCal

添加到工程中的文件包括

soapC.cpp

soapcalcService.h

soapcalcService.cpp

soapH.h

soapStub.h

calc.nsmap

stdsoap2.h

stdsoap2.cpp

stdsoap2.h和 stdsoap2.cpp这两个文件存在gsoap_2.8.8\gsoap-2.8\gsoap目录下面

main函数存所在的文件是ServerCalc.cpp

#include "soapcalcService.h"

#include "calc.nsmap"

int main(int argc, char **argv)

{

calcService calc;

if (argc < 2)

calc.serve();      /* serve as CGI application */

else

{

int port = atoi(argv[1]);

if (!port)

{

fprintf(stderr, "Usage:calcserver++ <port>\n");

exit(0);

}

/* run iterative server on port untilfatal error */

if (calc.run(port))

{

calc.soap_stream_fault(std::cerr);

exit(-1);

}

}

return 0;

}

int calcService::add(doublea, double b, double*result)

{ *result = a + b;

return SOAP_OK;

}

int calcService::sub(doublea, double b, double*result)

{ *result = a - b;

return SOAP_OK;

}

实现乘法,除法等的其他接口见源码

主函数代码比较简单,因为calcService 进行了一些封装

生成编译看下,运行下。要在控制台运行。使用cmd命令

exe程序的路径 端口号

例如 c:\ServerCalc.exe 8080

服务端运行起来之后,在浏览器输入http://localhost:8080/

如果没有看到类似下面的xml格式的文件,说明服务器出现错误

<?xmlversion="1.0" encoding="UTF-8" ?>

-<SOAP-ENV:Envelopexmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns="urn:calc">

-<SOAP-ENV:Body>

-<SOAP-ENV:Fault>

<faultcode>SOAP-ENV:Client</faultcode>

<faultstring>HTTPGET method not implemented</faultstring>

</SOAP-ENV:Fault>

</SOAP-ENV:Body>

</SOAP-ENV:Envelope>

客户端的编写

新建一个控制台程序 ClientCalc

需要添加到工程的文件包括

calc.nsmap

soapC.cpp

soapcalcProxy.cpp

soapcalcProxy.h

socpClient.cpp

soapH.h

soapStub.h

stdsoap2.h

stdsoap2.cpp

ClientCalc.cpp为main函数所在的文件,客户端代码如下

#include "soapcalcProxy.h"

#include "calc.nsmap"

const char server[] = "http://localhost:8080";

int main(int argc, char **argv)

{

if (argc < 4)

{

fprintf(stderr, "Usage:[add|sub|mul|div|pow] num num\n");

exit(0);

}

double a, b, result;

a = strtod(argv[2], NULL);

b = strtod(argv[3], NULL);

calcProxy calc;

calc.soap_endpoint = server;

switch (*argv[1])

{

case 'a':

calc.add(a, b, &result);

break;

case 's':

calc.sub(a,b, &result);

break;

case 'm':

calc.mul(a,b, &result);

break;

case 'd':

calc.div(a,b, &result);

break;

case 'p':

calc.pow(a,b, &result);

break;

default:

fprintf(stderr,"Unknown command\n");

exit(0);

}

if (calc.error)

calc.soap_stream_fault(std::cerr);

else

printf("result =%g\n", result);

return 0;

}

生成客户端exe,命令行执行

C:\Documents andSettings\Administrator>C:\work\ClientCalc\Debug\ClientCalc.exe a 1 2

让服务端计算1+2等于多少

如果出现如下错误,通常错误的原因是客户端的端口号与服务端的端口号不匹配

SOAP 1.1 fault:SOAP-ENV:Client[no subcode]

由于目标机器积极拒绝,无法连接。

Detail: connectfailed in tcp_connect()

源码下载地址:http://download.csdn.net/detail/flyfish1986/4299760

以上代码在winxp和vc6下编译通过

C++ 开发SOAP服务端和SOAP客户端相关推荐

  1. ASP.NET Core中间件(Middleware)实现WCF SOAP服务端解析

    ASP.NET Core中间件(Middleware)进阶学习实现SOAP 解析. 本篇将介绍实现ASP.NET Core SOAP服务端解析,而不是ASP.NET Core整个WCF host. 因 ...

  2. java接口测试解析soap_使用SOAPUI作为服务端测试soap接口(WSDL)

    在最近工作中有测试Java编写的soap客户端对于服务端提供的错误报文内容进行解析的需要,由于自己使用Java写的soap服务端代码不能明显的看出报文内容,所以使用soapUI工具作为服务端用于测试. ...

  3. 服务端渲染vs客户端渲染到前后端同构

    关于服务端渲染与客户端渲染的优劣,互联网上已经有过很多的文章进行过分析,在这里我谈一下我个人的见解. 首先,还是来老生常谈一下关于两种渲染方式的主要优劣: 服务端渲染(仅列出当下最突出的优劣): 优: ...

  4. 聚播微信多开客服系统二次开发SDK服务端接口

    聚播微信多开客服系统二次开发SDK服务端接口 case HeartBeatReq: {// 客户端发送的心跳包heartBeatReqHandler.handleMsg(ctx, msgVo);bre ...

  5. 使用Nuxt.js框架开发(SSR)服务端渲染项目

    (SSR)服务端渲染的优缺点 优点: 1.前端耗时少,首屏加载速度快.因为后端拼接完了html,浏览器只需要直接渲染出来. 2.有利于SEO.因为在后端有完整的html页面,所以爬虫更容易爬取获得信息 ...

  6. 华为云IoT智慧物流案例10 | 广和通L610模组FOTA升级(服务端FileZilla Server客户端FileZilla)

    华为云IoT智慧物流案例10 | 广和通L610模组FOTA升级(服务端FileZilla Server客户端FileZilla) 第一章 使用FileZilla Server搭建FTP服务器 第二章 ...

  7. 聚播微信群控云控引擎二次开发SDK服务端对接接口

    聚播微信群控云控引擎二次开发SDK服务端对接接口 case HeartBeatReq: {// 客户端发送的心跳包heartBeatReqHandler.handleMsg(ctx, msgVo);b ...

  8. 服务端渲染与客户端渲染详解(vue)

    1.客户端请求 (1)用户在浏览器输入请求的地址例如:172.0.0.1:8080 到服务器 服务器接受到客户端的请求拿到一个没有被数据渲染的空页面 (2)客户端拿到服务端的空字符串页面,然后从上往下 ...

  9. Socket服务端向指定客户端发送消息

    Socket服务端向指定客户端发送消息 解决思想 1.项目背景 2.如何上传与下发指令 3.解决方法 4.流程 解决思想 I.指定客户端远程地址是存起来的. II.服务端直接主动发信息给客户端,问题在 ...

最新文章

  1. Fastcgi是什么
  2. XML publisher 填充空白行数
  3. 发布Wear OS by Google开发者预览版
  4. java基础之继承补充和抽象类
  5. VTK:PolyData之CleanPolyData
  6. HDU 1260 Tickets
  7. Windows 8 Metro中文件的操作及访问(读写删除复制)
  8. ABAP培训进入SAP第一步
  9. STATA进行回归分析时,自变量是分类变量,如何设置哑变量?
  10. fx5u怎么与计算机通讯,两个FX5U系列PLC如何用RS485进行通信幻灯片
  11. 不是所有的努力都会有结果,但是你若不努力,谁能替你坚强??
  12. 一个电子商务网站的设计及开发环境配置文档
  13. IP地址的三种表示方式是什么
  14. 2022年登高架设免费试题及登高架设复审考试
  15. 前端通过eslint+prettier+husky统一代码风格
  16. 文档生成工具docsify光速上手
  17. if(!)什么意思?
  18. C++编程大师之路:从入门到精通-C++核心编程
  19. 爬虫究竟是合法的还是违法的
  20. 如何使用Git和GitHub社区?

热门文章

  1. Comparator接口
  2. go猫粮代理公司百加世:每个生命 都值得被尊重
  3. PyQt5 url设置圆形图片
  4. Adobe Photoshop CC 键盘快捷键
  5. 家用投影仪品牌推荐,如何选择家用投影仪?
  6. HTML5/jQuery界面控件:Ignite UI
  7. Elasticsearch漏洞汇总比较全
  8. 一个查身份证的手机程序
  9. 深度优先算法(DFS)
  10. 深度优先算法(一路走到底,不撞南墙不回头)