`
kofsky
  • 浏览: 201619 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

XMLRPC++学习笔记

阅读更多
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 &params, 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源代码,解析xml

    xmlrpc++0.7源代码,带VC工程文件,方便对xml进行编码和解码。如: &lt;member&gt; &lt;name&gt;result&lt;/name&gt; &lt;value&gt;&lt;i4&gt;0&lt;/i4&gt;&lt;/value&gt; &lt;member&gt; &lt;name&gt;desc&lt;/name&gt; &lt;value&gt;Success&lt;/value&gt; &lt;member&gt; &lt;name&gt;group...

    xmlrpc++0.7.zip

    xmlrpc++0.7.zip这个压缩包包含了XML-RPC协议在C++语言中的实现代码和测试例子,是开发者学习和使用XML-RPC的一个实用资源。 首先,我们要理解XML-RPC的基本概念。XML-RPC使用XML作为数据交换格式,通过HTTP协议...

    XmlRpc+Spring+Hibernate系统(源码)

    XmlRpc+Spring+Hibernate系统是一种基于Java的分布式应用程序开发架构,它将三种强大的技术整合在一起,以实现高效、灵活和可扩展的后端服务。在这个系统中,XML-RPC(远程过程调用)用于跨网络通信,Spring框架提供...

    xmlrpcPP.zip_xmlrpc_zip

    这个压缩包“xmlrpcPP.zip_xmlrpc_zip”包含了XMLRPC++的源代码,是开发者学习、理解和使用XML-RPC技术的重要资源。 XML-RPC是一种轻量级的网络通信协议,它使用HTTP作为传输协议,XML作为数据格式,使得不同编程...

    XMLRPC jar包+教程+例子

    学习并掌握XMLRPC可以帮助你理解分布式系统中的远程调用原理,对于开发跨平台的协作应用程序非常有帮助。然而,随着技术的发展,现今更多地推荐使用基于HTTP/2的gRPC或是基于JSON的RESTful API,它们在性能和易用性...

    XmlRpcThd:轻量级的基于C ++的xmlrpc客户端-开源

    基于Chris Morley出色的著作“ XmlRpc ++”派生的XmlRpc库。 / *由ise GmbH 2013更改* /-添加了多线程支持-添加了对Windows编译的支持-扩展类XmlRpcValue用于某些定义的输入格式的自动类型识别-添加了二进制协议以...

    面向嵌入式系统XML-RPC的C实现设计

    ### 面向嵌入式系统XML-RPC的C实现设计 #### 摘要与背景 随着嵌入式系统和网络技术的迅速发展,Web服务(Webservice)的应用已经扩展到了嵌入式系统领域。这使得跨平台的嵌入式系统能够实现远程程序调用(RPC),...

    xml-rpc 1.5.1

    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 java_xmlrpc s_xmlrpc-2.0.1.jar_

    `xmlrpc-2.0-src.zip`是源代码压缩包,包含了XMLRPC库的源代码,供开发者学习和定制;`xmlrpc-2.0.1.jar`是预编译的二进制库,可以直接在Java项目中引用,用于实现XMLRPC功能。 描述中提到的"xmlrpc-2.0-src.zip ...

    基于python的xmlrpc示例

    学习这些文件,你需要理解以下核心概念: 1. XMLRPC的基本原理和消息格式:了解如何将函数调用和参数编码为XML,以及如何解码服务器返回的结果。 2. Python的`xmlrpc.server`和`xmlrpc.client`模块:熟悉这两个模块...

    Go-go-xmlrpc-为golang添加XMLRPC支持

    `go-xmlrpc`库就是为了解决这个问题而设计的,它为Golang添加了对XMLRPC的支持,并且利用`go generate`工具自动生成XML解析代码,提高了开发效率和代码质量。 `go-xmlrpc`库的主要功能和特点包括: 1. **XML编码与...

    xmlrpc demo

    这个"xmlrpc demo"是一个示例项目,包含服务端和客户端的实现,是学习XMLRPC入门的良好起点。 在服务端,XMLRPC服务器通常会监听一个特定的HTTP端口,等待来自客户端的请求。当请求到来时,服务器解析XML数据,识别...

    xmlrpc简单示例

    XMLRPC在分布式系统、Web服务以及不同语言间的通信中起到了重要的作用。下面将详细阐述XMLRPC的基本原理、工作流程及其在实际应用中的价值。 XMLRPC的核心思想是使用HTTP作为传输协议,XML作为数据交换格式,实现...

    XmlRpcClient.rar_XMLRPCClient_visual c_xmlrpc

    3. **XMLRPC库**:为了简化XMLRPC的实现,开发者通常会使用专门的XMLRPC库,如XMLRPC++或libxmlrpc。这些库提供了一套接口,使得开发者可以方便地创建和解析XMLRPC请求及响应。 4. **序列化与反序列化**:XMLRPC...

    xmlrpc-c源码包

    XMLRPC(XML Remote Procedure Call)是一种使用XML作为协议的远程过程调用标准,它允许不同编程语言和操作系统之间的客户端和服务器进行通信。xmlrpc-c是XMLRPC的一个C语言实现,这个源码包提供了在C环境中使用...

    xmlrpc3.1.3 jar包.

    xmlrpc jar包. 版本: 3.1.3

    xmlrpc 导入的Lib

    学习和使用`xmlrpc`库,不仅可以加深对远程调用和网络通信的理解,还能帮助开发分布式系统,提升应用程序的功能和扩展性。在实际项目中,应确保对传输的数据进行适当的序列化和反序列化处理,以及考虑错误处理和安全...

    xmlrpc类库

    XMLRPC库是实现这一通信机制的工具,为开发者提供了方便的API接口,使得在不同的编程语言之间进行跨平台的远程调用成为可能。 XMLRPC库的核心原理是通过XML编码参数和返回值,利用HTTP作为传输协议,实现了类似本地...

    java xmlrpc框架包

    Java XMLRPC框架是一个用于在Java应用程序之间实现远程过程调用(RPC)的工具,它基于XML数据格式进行通信。XMLRPC允许程序通过HTTP协议发送请求并接收响应,从而实现跨平台、跨语言的分布式计算。这个框架使得...

Global site tag (gtag.js) - Google Analytics