C++ 开发SOAP服务端和SOAP客户端
来源:互联网 发布:诺基亚运行python 编辑:程序博客网 时间:2024/05/18 09:04
目的:利用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客户端
- C++ 开发SOAP服务端和SOAP客户端
- VC++MFC下实现SOAP服务端和SOAP客户端
- VC++MFC下实现SOAP服务端和SOAP客户端
- VC++MFC下实现SOAP服务端和SOAP客户端
- soap客户端调用服务端代码
- 一个简单的SOAP服务端和一个客户端
- php SOAP客户端访问 JAVA soap服务端示例
- C语言实现soap 客户端的提交和接收功能
- 使用CXF 开发SOAP webservice 服务端实例
- soap实例 客户端(c++) + 服务器端(web + com+)-soap服务配置
- SOAP实例:客户端(C++) + 服务器端(Web + COM+)
- VC++ 实现soap服务端
- php中soap使用,SoapServer服务端编写,SoapClient客户端编写
- 使用Visual C++开发SOAP客户端应用
- libcurl + libxml2 + soapUI开发SOAP客户端程序
- 使用Visual C++开发SOAP客户端应用
- 使用VISUAL C++开发SOAP客户端应用
- Magento 获取每个页面的title
- Mysql 体系结构系列之五
- hdu-逃离迷宫
- Mobile Automation testing Tools
- tableView点击下拉更多的效果
- C++ 开发SOAP服务端和SOAP客户端
- iOS之ASIHttp简单的网络请求实现
- C# 打开窗体设计界面出错
- VC++MFC下实现SOAP服务端和SOAP客户端
- hibernate查询方式中load和get的使用
- 转自《程序员你伤不起》--总结过去10年的程序员生涯,给程序员小弟弟小妹妹们的一些总结性忠告
- Eclipse中XSD文件缓存
- 百练-2746-OnlineJudge-约瑟夫问题.一(栈,数组模拟)
- awk的printf用法