VC中使用XMLRPC

本文详细介绍了如何使用XMLRPC库实现与其他系统的接口,包括下载安装、熟悉使用、传递结构体等步骤,并提供了实例代码。

我目前的工作任务是使用XMLRPC实现与其他系统的接口。以前没有用过XMLRPC。两天半时间才搞定。把步骤记录下来以备以后参考。

首先从XMLRPC官网http://www.xmlrpc.com/,或者http://sourceforge.net/projects/xmlrpcpp/网站下载XMLRPC++0.7。解压。

1.熟悉XMLRPC

可以运行xmlrpc.dsw工程中的的例子。阅读HelloServer、HelloClient工程的源码,可以大概了解XMLRPC如何使用。

2. 传递结构体的例子

创建client工程,类型为Win32 Console Application。

将src文件夹、xmlrpc.dsp文件复制到client工程目录下。

并将xmlrpc.dsp添加到自己的工作空间中。

在Project->settings->c/c++->Category->Preprocesser->Additional include directions添加xmlrpc.lib的头文件路径“src”。

在Project->settings->Link->Category->General->Object/Library Modules中添加xmlrpc.lib Ws2_32.lib两个lib,

在Project->settings->Link->Category->Input->Additional Library path中添加xmlrpc.lib所在路径“debug”。

可以在Project->settings->Debug->Program arguments中添加程序参数,本例为端口“9000”。

并将Project->settings->c/c++->Category->Code Generation->Use Run time Library 修改为MultiThreaded DLL或者Debug MultiThreaded DLL。

参照xmlrpc自带例子,写出传递结构体的文件如下:

#include "stdafx.h"
#include "XmlRpc.h"
#include <iostream>
using namespace XmlRpc;

int main(int argc, char* argv[])
{
if (argc != 3) {
std::cerr << "Usage: HelloClient serverHost serverPort\n";
return -1;
}
int port = atoi(argv[2]);

// Use introspection API to look up the supported methods
XmlRpcClient c(argv[1], port);
//liuling
XmlRpcValue arg, result;

arg["a"] = "Hello";
arg["b"] = 20.5;

XmlRpcValue arg2;
arg2[0]=arg;
std::cout << arg2.toXml() << std::endl;


if (c.execute("HelloWorld", arg2, result))


std::cout << "Hello World method c: " << result[0]["c"] << " d:" << result[0]["d"] << "\n\n";
else
std::cout << "Error calling 'HelloWorld'\n\n";

return 0;
}

创建server工程,工程设置参考client。

#include "stdafx.h"
#include "XmlRpc.h"
#include <iostream>
#include <stdlib.h>

using namespace XmlRpc;

// The server
XmlRpcServer s;

// No arguments, result is "Hello".
class HelloWorld : public XmlRpcServerMethod
{
public:
HelloWorld(XmlRpcServer* s) : XmlRpcServerMethod("HelloWorld", s) {}

void execute(XmlRpcValue& params, XmlRpcValue& result)
{
//std::cout << params.toXml();
//std::cout << "params.size():" << params.size() << std::endl;
//result["c"] = ( std::string( params["a"] ) + std::string( params["b"] ) );
//int x=params;
double b = double( params[0]["b"] );
std::cout << "Hello World a:" << std::string( params[0]["a"] ) << "b:" << b << std::endl;
result[0]["c"] = std::string( params[0]["a"] );
result[0]["d"] = b * 2;
}

std::string help() { return std::string("Say hello"); }

} helloworld(&s); // This constructor registers the method with the server


int main(int argc, char* argv[])
{
XmlRpcLogHandler::setVerbosity(1000);
if (argc != 2) {
std::cerr << "Usage: HelloServer serverPort\n";
return -1;
}
int port = atoi(argv[1]);

XmlRpc::setVerbosity(5);

// Create the server socket on the specified port
s.bindAndListen(port);

// Enable introspection
s.enableIntrospection(true);

// Wait for requests indefinitely
s.work(-1.0);

return 0;
}

### 使用Python中的XML-RPC进行远程过程调用 在Python中实现XML-RPC客户端和服务端相对简单。通过`xmlrpc.client`模块可以方便地发起远程过程调用请求,而服务端则可以通过`xmlrpc.server`来处理这些请求。 #### 创建XML-RPC服务器 为了演示目的,在本地启动一个简单的XML-RPC服务器作为例子: ```python from xmlrpc.server import SimpleXMLRPCServer def add(x, y): return x + y server = SimpleXMLRPCServer(("localhost", 8000)) print("Listening on port 8000...") server.register_function(add, "add") try: server.serve_forever() except KeyboardInterrupt: print("\nExiting.") ``` 这段代码定义了一个名为`add`的方法并将其注册到服务器上[^3]。当有来自客户端的对应方法名的请求到达时,该方法就会被执行并将结果返回给客户端。 #### 构建XML-RPC客户端 接下来编写一段用于连接上述服务器并向其发送请求的客户端程序: ```python import xmlrpc.client proxy = xmlrpc.client.ServerProxy('http://localhost:8000/') result = proxy.add(5, 3) print(f"The result is {result}") ``` 这里创建了一个指向运行着前面提到的服务端口地址(`http://localhost:8000/`)的对象`proxy`。之后就可以像调用本地函数一样调用远端暴露出来的接口了——在这个案例里就是`add()`方法[^1]。 值得注意的是,如果希望更轻松地操作响应数据,则可以让库自动将接收到的数据转换成易于使用的结构化形式,比如PHP数组变量;对于Python来说,默认情况下已经提供了这种便利性[^2]。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值