C++ 开发SOAP服务端和SOAP客户端
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客户端相关推荐
- ASP.NET Core中间件(Middleware)实现WCF SOAP服务端解析
ASP.NET Core中间件(Middleware)进阶学习实现SOAP 解析. 本篇将介绍实现ASP.NET Core SOAP服务端解析,而不是ASP.NET Core整个WCF host. 因 ...
- java接口测试解析soap_使用SOAPUI作为服务端测试soap接口(WSDL)
在最近工作中有测试Java编写的soap客户端对于服务端提供的错误报文内容进行解析的需要,由于自己使用Java写的soap服务端代码不能明显的看出报文内容,所以使用soapUI工具作为服务端用于测试. ...
- 服务端渲染vs客户端渲染到前后端同构
关于服务端渲染与客户端渲染的优劣,互联网上已经有过很多的文章进行过分析,在这里我谈一下我个人的见解. 首先,还是来老生常谈一下关于两种渲染方式的主要优劣: 服务端渲染(仅列出当下最突出的优劣): 优: ...
- 聚播微信多开客服系统二次开发SDK服务端接口
聚播微信多开客服系统二次开发SDK服务端接口 case HeartBeatReq: {// 客户端发送的心跳包heartBeatReqHandler.handleMsg(ctx, msgVo);bre ...
- 使用Nuxt.js框架开发(SSR)服务端渲染项目
(SSR)服务端渲染的优缺点 优点: 1.前端耗时少,首屏加载速度快.因为后端拼接完了html,浏览器只需要直接渲染出来. 2.有利于SEO.因为在后端有完整的html页面,所以爬虫更容易爬取获得信息 ...
- 华为云IoT智慧物流案例10 | 广和通L610模组FOTA升级(服务端FileZilla Server客户端FileZilla)
华为云IoT智慧物流案例10 | 广和通L610模组FOTA升级(服务端FileZilla Server客户端FileZilla) 第一章 使用FileZilla Server搭建FTP服务器 第二章 ...
- 聚播微信群控云控引擎二次开发SDK服务端对接接口
聚播微信群控云控引擎二次开发SDK服务端对接接口 case HeartBeatReq: {// 客户端发送的心跳包heartBeatReqHandler.handleMsg(ctx, msgVo);b ...
- 服务端渲染与客户端渲染详解(vue)
1.客户端请求 (1)用户在浏览器输入请求的地址例如:172.0.0.1:8080 到服务器 服务器接受到客户端的请求拿到一个没有被数据渲染的空页面 (2)客户端拿到服务端的空字符串页面,然后从上往下 ...
- Socket服务端向指定客户端发送消息
Socket服务端向指定客户端发送消息 解决思想 1.项目背景 2.如何上传与下发指令 3.解决方法 4.流程 解决思想 I.指定客户端远程地址是存起来的. II.服务端直接主动发信息给客户端,问题在 ...
最新文章
- Fastcgi是什么
- XML publisher 填充空白行数
- 发布Wear OS by Google开发者预览版
- java基础之继承补充和抽象类
- VTK:PolyData之CleanPolyData
- HDU 1260 Tickets
- Windows 8 Metro中文件的操作及访问(读写删除复制)
- ABAP培训进入SAP第一步
- STATA进行回归分析时,自变量是分类变量,如何设置哑变量?
- fx5u怎么与计算机通讯,两个FX5U系列PLC如何用RS485进行通信幻灯片
- 不是所有的努力都会有结果,但是你若不努力,谁能替你坚强??
- 一个电子商务网站的设计及开发环境配置文档
- IP地址的三种表示方式是什么
- 2022年登高架设免费试题及登高架设复审考试
- 前端通过eslint+prettier+husky统一代码风格
- 文档生成工具docsify光速上手
- if(!)什么意思?
- C++编程大师之路:从入门到精通-C++核心编程
- 爬虫究竟是合法的还是违法的
- 如何使用Git和GitHub社区?