1 参数类型 XmlRpcValue
标量数据类型(scalar )
参数值<value>可以是标量,用类型标签将值包括起来。如果没指定类型,则认为是string类型。
<i4>或者 <int>表示 4字节带符号整数值
<boolean>表示 0 (false) or 1 (true)
<string>表示 字符串
<double>表示 双精度带符号浮点值
<dateTime.iso8601>表示 日期/时间
<base64>表示 base64编码的二进制数据
结构数据类型(<struct>)
参数值也可以是<struct>类型一个<struct>可含有几个<member>项,每个< member>含有一个<name>项和一个<value>项。<member>的< value>值可以为任何类型,可为标量类型、<array>甚至<struct>(即可以递归).
数组数据类型(<array>)
参数值也可以是<array>类型一个<array>含有单一的 <data> 元素,<data>元素可以含有任意数量的<value>, 这里的<value>没有name.每个<value>的数据类型可各不相同,如下例所示。
<data>的<value>值可以为任何类型,可为标量类型、 <struct>甚至<array>(即可以递归).
(例子可参见:http://hedong.3322.org/archives/000470.html)
XMLRPC++代码中与此对应的是类 XmlRpc::XmlRpcValue
类型定义如下:
enum Type {
TypeInvalid,// 非法类型
TypeBoolean,// 0 (false) or 1 (true)
TypeInt,// 4字节带符号整数值
TypeDouble,// 双精度带符号浮点值
TypeString,// 字符串
TypeDateTime,// 日期/时间
TypeBase64,// base64编码的二进制数据
TypeArray, // 数组数据类型
TypeStruct // 结构数据类型
};
typedef std::vector<char> BinaryData; // 二进制数据
typedef std::vector<XmlRpcValue> ValueArray; // 数组
typedef std::map<std::string, XmlRpcValue> ValueStruct;// 结构
一个 XmlRpcValue 对象只能有一个值,通过一个联合来定义,如下:
union {
bool asBool
int asInt
double asDouble
tm * asTime
std::string * asString
BinaryData * asBinary
ValueArray * asArray
ValueStruct * asStruct
} _value;
类XmlRpcValue提供的方法包括如下几类:
a 从xml中获得数据,如boolFromXml,intFromXml,doubleFromXml等
b 将数据转换成xml格式,如boolToXml,intToXml,doubleToXml等(继承自 XmlRpcSource):
c 类型检查,如assertArray,assertStruct等
d 操作符重载,如赋值=,==,!=等,若为数组,则可使用 [] 提取指定元素
e 其他
XMLRPC 执行远程调用时,其输入参数与执行结果均封装在 XmlRpcValue 对象中。
执行顺序如下:
客户端 将需执行的方法,以及方法参数(XmlRpcValue)以XML格式(通过HTTP协议)传输到服务器端,服务器解析XML,获得以XmlRpcValue封装的参数,在服务器端调用方法,获得以 XmlRpcValue封装的执行结果,将其以XML格式传输至客户端,客户端解析,获得执行结果(XmlRpcValue)。
也就是说,所有的数据都是 通过 XmlRpcValue 格式 进行 交互。
参数:
客户端 参数 -> XmlRpcValue params-> XML -> HTTP协议传输 -> XML ->XmlRpcValue params->服务器端 参数
执行结果:
服务器端 执行结果 -> XmlRpcValue result-> XML -> HTTP协议传输 -> XML ->XmlRpcValue result->客户端 执行结果
2 服务器支持的调用方法的基类 XmlRpc::XmlRpcServerMethod
所有服务器支持的方法必须继承自 XmlRpcServerMethod
包含两个字段:
std::string _name 方法名称
XmlRpcServer * _server 服务器
构造函数为XmlRpcServerMethod(std::string const& name, XmlRpcServer* server),其中有一句:
if (_server) _server->addMethod(this);
这句是方法向服务器注册本身。
执行的关键则在于其一个纯虚函数:
virtual void execute (XmlRpcValue ¶ms, XmlRpcValue &result)=0
调用方法的实现过程 就在这个函数内实现。
输入参数为 params,从客户端读取而获得;执行结果 放入 result,执行完毕后返回给客户端。
例子:
#include "XmlRpc.h"
using namespace XmlRpc;
// The server
XmlRpcServer s;
// The Hello method. No arguments, result is "Hello".
class Hello : public XmlRpcServerMethod
...{
public:
Hello(XmlRpcServer* s) : XmlRpcServerMethod("Hello", s) ...{}
void execute(XmlRpcValue& params, XmlRpcValue& result)
...{
result = "Hello";
}
} hello(&s); // This constructor registers the method with the server
3 RPC处理的端点 RpcSource:An RPC source represents a file descriptor to monitor
这个类是服务器与客户端的基类。可以这样理解,一个 RpcSource 就表示一个 Socket 连接。
RpcSource 包括三个私有成员:
int _fd; socket file descriptor to monitor,socket连接
bool _deleteOnClose; 当连接关闭时,是否删除本身
bool _keepOpen; In the client, keep connections open if you intend to make multiple calls.
关键函数:
virtual unsigned handleEvent(unsigned eventType) = 0;
4 RPC客户端 XmlRpc::XmlRpcClient(继承自 XmlRpcSource):发送请求至服务器端,并读取分析服务器的 响应
客户端有六个状态分别为:NO_CONNECTION, CONNECTING, WRITE_REQUEST, READ_HEADER, READ_RESPONSE, IDLE
构造函数XmlRpcClient(const char* host, int port, const char* uri=0);
参数 host表示服务器端地址,port表示端口号,uri是http请求头的可选串; 构造函数将客户状态设置为:NO_CONNECTION
关键函数:
bool XmlRpcClient::execute(const char* method, XmlRpcValue const& params, XmlRpcValue& result)
在服务器端执行以method名称指定的方法;方法参数 params,执行结果 result
(调用其他函数 setupConnection generateRequest XmlRpcDispatch.work parseResponse 实现功能 )
unsigned XmlRpcClient::handleEvent(unsigned eventType)
处理服务器的响应。该方法在 XmlRpcDispatch 被调用。
(调用其他函数 writeRequest readHeader readResponse 实现功能 )
setupConnection,writeRequest,readHeader,readResponse等函数中依次修改 客户的状态。
5 RPC服务器XmlRpc::XmlRpcServer(继承自 XmlRpcSource):处理客户请求
该类只监听客户的连接请求,而不处理其调用函数的请求。函数 bindAndListen 将服务器绑定至指定的端口并准备开始监听。
函数 void XmlRpcServer::work(double msTime) 在指定的时间msTime内处理用户请求
work 调用 XmlRpcDispatch.work 开始工作,XmlRpcDispatch.work 调用 XmlRpcServer.handleEvent 接受用户请求。
真正接受用户请求的代码在 acceptConnection 中,被 handleEvent 调用。
每有一个用户连接请求到来,都会执行 acceptConnection函数 accpet之后的代码,创建一个新的 XmlRpcServerConnection。
每一个 XmlRpcServerConnection 都为一个单独的客户进行服务:接受请求,在服务器端执行代码(XmlRpcDispatch.work),并产生响应。
XmlRpcServer对象维护所支持的调用方法列表,以<方法名,方法对象*>格式,其定义如下:
typedef std::map< std::string, XmlRpcServerMethod* > MethodMap;即方法名于方法对象的映射
MethodMap _methods;
XmlRpcServer对象维护事件分发器对象 XmlRpcDispatch _disp;
各方法真正执行在 _disp.work() 被调用执行。
6 RPC服务器 连接类 XmlRpcServerConnection(继承自 XmlRpcSource):每一个客户均与一个 XmlRpcServerConnection 对象对应,并为其服务
该类有四个状态分别为: READ_HEADER, READ_REQUEST, WRITE_RESPONSE
unsigned XmlRpcServerConnection::handleEvent(unsigned /*eventType*/)
接受客户请求,并在服务器端执行请求的方法,并将执行结果返回
7 XmlRpc::XmlRpcDispatch
这个类理解有些模糊。感觉像把所有的事情集中起来,然后放在一起处理。
该类维护一个当前被监视的对象列表 typedef std::list< MonitoredSource > SourceList;
每一个被监视的对象定义为:
struct MonitoredSource {
XmlRpcSource* _src;
unsigned _mask;
};
其核心这个方法:
void XmlRpcDispatch::work(double timeout)
...{
……
//顺序遍历所有源,并处理每个源的方法handleEvent
for (it=_sources.begin(); it != _sources.end(); )
...{
SourceList::iterator thisIt = it++;
XmlRpcSource* src = thisIt->getSource();
int fd = src->getfd();
unsigned newMask = (unsigned) -1;
if (fd <= maxFd) ...{
if (FD_ISSET(fd, &inFd))
newMask &= src->handleEvent(ReadableEvent);
if (FD_ISSET(fd, &outFd))
newMask &= src->handleEvent(WritableEvent);
if (FD_ISSET(fd, &excFd))
newMask &= src->handleEvent(Exception);
}
……
}
参考 :http://xmlrpcpp.sourceforge.net/
分享到:
相关推荐
xmlrpc++0.7源代码,带VC工程文件,方便对xml进行编码和解码。如: <member> <name>result</name> <value><i4>0</i4></value> <member> <name>desc</name> <value>Success</value> <member> <name>group...
xmlrpc++0.7.zip这个压缩包包含了XML-RPC协议在C++语言中的实现代码和测试例子,是开发者学习和使用XML-RPC的一个实用资源。 首先,我们要理解XML-RPC的基本概念。XML-RPC使用XML作为数据交换格式,通过HTTP协议...
XmlRpc+Spring+Hibernate系统是一种基于Java的分布式应用程序开发架构,它将三种强大的技术整合在一起,以实现高效、灵活和可扩展的后端服务。在这个系统中,XML-RPC(远程过程调用)用于跨网络通信,Spring框架提供...
这个压缩包“xmlrpcPP.zip_xmlrpc_zip”包含了XMLRPC++的源代码,是开发者学习、理解和使用XML-RPC技术的重要资源。 XML-RPC是一种轻量级的网络通信协议,它使用HTTP作为传输协议,XML作为数据格式,使得不同编程...
学习并掌握XMLRPC可以帮助你理解分布式系统中的远程调用原理,对于开发跨平台的协作应用程序非常有帮助。然而,随着技术的发展,现今更多地推荐使用基于HTTP/2的gRPC或是基于JSON的RESTful API,它们在性能和易用性...
基于Chris Morley出色的著作“ XmlRpc ++”派生的XmlRpc库。 / *由ise GmbH 2013更改* /-添加了多线程支持-添加了对Windows编译的支持-扩展类XmlRpcValue用于某些定义的输入格式的自动类型识别-添加了二进制协议以...
### 面向嵌入式系统XML-RPC的C实现设计 #### 摘要与背景 随着嵌入式系统和网络技术的迅速发展,Web服务(Webservice)的应用已经扩展到了嵌入式系统领域。这使得跨平台的嵌入式系统能够实现远程程序调用(RPC),...
s mbstring extension is enabled, use mb_convert_encoding() to ensure the client payload matches the intended encoding. This is a better resolution of Bug 7376. ...s SAX parser. The automatic base64 ...
`xmlrpc-2.0-src.zip`是源代码压缩包,包含了XMLRPC库的源代码,供开发者学习和定制;`xmlrpc-2.0.1.jar`是预编译的二进制库,可以直接在Java项目中引用,用于实现XMLRPC功能。 描述中提到的"xmlrpc-2.0-src.zip ...
学习这些文件,你需要理解以下核心概念: 1. XMLRPC的基本原理和消息格式:了解如何将函数调用和参数编码为XML,以及如何解码服务器返回的结果。 2. Python的`xmlrpc.server`和`xmlrpc.client`模块:熟悉这两个模块...
`go-xmlrpc`库就是为了解决这个问题而设计的,它为Golang添加了对XMLRPC的支持,并且利用`go generate`工具自动生成XML解析代码,提高了开发效率和代码质量。 `go-xmlrpc`库的主要功能和特点包括: 1. **XML编码与...
这个"xmlrpc demo"是一个示例项目,包含服务端和客户端的实现,是学习XMLRPC入门的良好起点。 在服务端,XMLRPC服务器通常会监听一个特定的HTTP端口,等待来自客户端的请求。当请求到来时,服务器解析XML数据,识别...
XMLRPC在分布式系统、Web服务以及不同语言间的通信中起到了重要的作用。下面将详细阐述XMLRPC的基本原理、工作流程及其在实际应用中的价值。 XMLRPC的核心思想是使用HTTP作为传输协议,XML作为数据交换格式,实现...
3. **XMLRPC库**:为了简化XMLRPC的实现,开发者通常会使用专门的XMLRPC库,如XMLRPC++或libxmlrpc。这些库提供了一套接口,使得开发者可以方便地创建和解析XMLRPC请求及响应。 4. **序列化与反序列化**:XMLRPC...
XMLRPC(XML Remote Procedure Call)是一种使用XML作为协议的远程过程调用标准,它允许不同编程语言和操作系统之间的客户端和服务器进行通信。xmlrpc-c是XMLRPC的一个C语言实现,这个源码包提供了在C环境中使用...
xmlrpc jar包. 版本: 3.1.3
学习和使用`xmlrpc`库,不仅可以加深对远程调用和网络通信的理解,还能帮助开发分布式系统,提升应用程序的功能和扩展性。在实际项目中,应确保对传输的数据进行适当的序列化和反序列化处理,以及考虑错误处理和安全...
XMLRPC库是实现这一通信机制的工具,为开发者提供了方便的API接口,使得在不同的编程语言之间进行跨平台的远程调用成为可能。 XMLRPC库的核心原理是通过XML编码参数和返回值,利用HTTP作为传输协议,实现了类似本地...
Java XMLRPC框架是一个用于在Java应用程序之间实现远程过程调用(RPC)的工具,它基于XML数据格式进行通信。XMLRPC允许程序通过HTTP协议发送请求并接收响应,从而实现跨平台、跨语言的分布式计算。这个框架使得...