`
安静思考
  • 浏览: 12650 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

远程调用之XML-RPC

阅读更多

第一、XML-RPC介绍

    按照XML-RPC的规范,定义是:XML-RPC是工作在互联网上的远程程序调用协议。它可以允许软件运行在分布式的系统之上,通过互联网进行软件中程序之间的调用 其传输协议是HTTP,传送数据编码格式是XML。由于是通过HTTP传输数据,因此基于XML-RPC的软件不受操作环境环境、 编程语言等限制( 比如RMI只能用于java程序之间传输),由于是通过http协议传输,因此可以通过防火墙的限制,具有简单易用等特点。

第二、XML-RPC的使用

     XML-RPC只是一个协议,这里主要介绍一个实现了 XML-RPC协议的java 开源的框架apache的 XML-RPC 实现。

     第一步:去官方下载XML-RPC框架,地址是:Apache XML-RPC

     第二步: XML-RPC分为客户端跟服务端。

    创建服务端

XmlRpcServer主要是在服务端用来处理客户端发过来的请求并返回请求数据的类, 利用Apache的 XML-RPC有以下几种创建服务端的方式:

        1、 XmlRpcServer嵌入到一个Servlet容器中。

框架提供了一个Servlet的实现类: XmlRpcServlet,这个类自动的嵌入了 XmlRpcServer中,因此只需要将这个类部署到 Servlet容器中即可实现服务端。具体步骤是:

  • 定义处理远程调用的类
package org.apache.xmlrpc.demo;
    public class Calculator {
                public int add(int i1, int i2) {
                        return i1 + i2;
                }
                public int subtract(int i1, int i2) {
                        return i1 - i2;
                }
    }
  •  创建一个名称为XmlRpcServlet.properties的属性文件,里面用来存放处理远程调用的类,内容是Calculator=org.apache.xmlrpc.demo.Calculator,这里名字可以任意取,主要是用来在服务端注册这个实例类的。注意 :这个属性文件的名称是固定的,并且必须放在 org.apache.xmlrpc.webserver这个包下面.
  • 将这个Servlet配置到 web.xml文件中,如下:

 

<servlet>
        <servlet-name>XmlRpcServlet</servlet-name>
        <servlet-class>org.apache.xmlrpc.webserver.XmlRpcServlet</servlet-class>
        <init-param>
          <param-name>enabledForExtensions</param-name>
          <param-value>true</param-value>
          <description>
            Sets, whether the servlet supports vendor extensions for XML-RPC.
          </description>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>XmlRpcServlet</servlet-name>
        <url-pattern>/xmlrpc</url-pattern>
    </servlet-mapping>

 XmlRpcServlet有两个重要的配置属性:

    enabledForExceptions: 当服务端捕获到一个异常时,并且在web.xml文件中配置了这个属性为true,服务端会将这个异常转换成一个字节数组Byte[]返回给客户端。

   enabledForExtensions: 这个开源框架设置这个属性是为了扩展 XML-RPC协议的,因为完全符合原始协议 会有许多功能上的限制,比如一些基本的java原始数据类型都不能用,并且还要求发送的请求(request)需要设置content-length头,在http协议中,在请求头文件中设置这个属性意味着在发送请求或者相应之前,要把请求或者相应强制的写到字节数组中,而这是很耗时耗内存的工作。默认的情况下,是符合原始的XML-RPC协议的,也即这个属性值是false的,我们可以设置这个属性为true来扩展协议,需要注意的是 ,在client端与server端都有这个属性,只有在两端同时设置这个属性为true时才可用。设置这个属性后,就可以使用非常快速的节省内存的流模式,并且允许大部分的java对象传输:long, short, byte,float, DOM 节点, 实现了java.io.Serializable接口的对象实例 或者 JAXB对象。

这样我们就创建了一个XML-RPC服务端

 

        2、利用XML-RPC自带的HTTP Server实现服务端

利用WebServer作为服务端是经常用的方式,利用这种方式,需要手动的去读取配置文件,但是这里可以任意的命名属性配置文件,当然也可以在程序中指定属性。但是相对于嵌入到Servlet的方式,这种方式要慢一些。代码如下:

package org.apache.xmlrpc.demo.webserver;

  import java.net.InetAddress;

  import org.apache.xmlrpc.common.TypeConverterFactoryImpl;
  import org.apache.xmlrpc.demo.webserver.proxy.impls.AdderImpl;
  import org.apache.xmlrpc.server.PropertyHandlerMapping;
  import org.apache.xmlrpc.server.XmlRpcServer;
  import org.apache.xmlrpc.server.XmlRpcServerConfigImpl;
  import org.apache.xmlrpc.webserver.WebServer;

  public class Server {
      private static final int port = 8080;

      public static void main(String[] args) throws Exception {
          WebServer webServer = new WebServer(port);
        
          XmlRpcServer xmlRpcServer = webServer.getXmlRpcServer();
        
          PropertyHandlerMapping phm = new PropertyHandlerMapping();
          /* 从配置文件中加载.
           * The property file might look like:
           *   Calculator=org.apache.xmlrpc.demo.Calculator
           *   org.apache.xmlrpc.demo.proxy.Adder=org.apache.xmlrpc.demo.proxy.AdderImpl
           */
          phm.load(Thread.currentThread().getContextClassLoader(),
                   "MyHandlers.properties");

          /* 也可以像这样直接指定:
           * phm.addHandler("Calculator",
           *     org.apache.xmlrpc.demo.Calculator.class);
           * phm.addHandler(org.apache.xmlrpc.demo.proxy.Adder.class.getName(),
           *     org.apache.xmlrpc.demo.proxy.AdderImpl.class);
           */
          xmlRpcServer.setHandlerMapping(phm);
        
          XmlRpcServerConfigImpl serverConfig =
              (XmlRpcServerConfigImpl) xmlRpcServer.getConfig();
          serverConfig.setEnabledForExtensions(true);
          serverConfig.setContentLengthOptional(false);

          webServer.start();
      }
  }

 这样服务端就建好了。

     创建客户端

客户端主要是通过XmlRpcClient类来实现,这是一个无状态的线程安全的类,客户端的配置主要是通过这两个对象来配置:

 

名称
对象描述
ClientConfig 在这个接口类中设置一些原子属性,比如服务端rul、编码格式等,这个类的实现都是XmlRpcClientConfig的接口实现
TransportFactory

这个接口的任务是创建一个利用客户端的配置信息来与服务端对话的类,这里有两个这样的实现类,一个是创建 java.net里面的类(默认情况下是用这个)来与服务端进行通信,还有一个是利用Jakarta Commons Http Client的实现类

 

 

 

 

 

 

 

 

 

利用默认的TransportFactory的客户端代码片段:

    XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();
    config.setServerURL(new URL("http://127.0.0.1:8080/xmlrpc"));
    XmlRpcClient client = new XmlRpcClient();
    client.setConfig(config);
    Object[] params = new Object[]{new Integer(33), new Integer(9)};
    Integer result = (Integer) client.execute("Calculator.add", params);

 利用 基于Jakarta HTTP Client的factory代码如下

    XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();
    config.setServerURL(new URL("http://127.0.0.1:8080/XmlRpcServlet"));
    XmlRpcClient client = new XmlRpcClient();
    client.setTransportFactory(new XmlRpcCommonsTransportFactory(client));// 这里
   client.setConfig(config);
    Object[] params = new Object[]{new Integer(2), new Integer(3)};
    Integer result = (Integer) client.execute("Calculator.add", params);

 内置的TransportFactory的实现以及Config所可以设置的属性,可以参考官方文档。

注意 运行这个例子的时候会出现异常比如用到基于Jakarta HTTP Client的Factory时,因为这个开源包没有包含 Jakarta HTTP Client的jar包,因此需要到官网上下载这个jar包。

第三、总结

     总的来说,Apache XML-RPC简单易用,既兼容了XML-RPC的规范,有可以对其进行扩展,增强器功能性, 由于扩展了 XML-RPC的协议,因此所支持的java对象类型比较丰富 XML-RPC协议仅仅支持以下几种类型:

 Integer,Boolean,String,Double,java.util.Date,byte[],java.util.Map,Object[],java.util.List, 当设置了enabledForExtensions属性时,可以额外支持以下属性:

Byte,Float,Long,org.w3c.dom.Node,Short,java.io.Serializable,BigDecimal,BigInteger,java.util.Calendar。但是缺点也很明显,在客户端调用服务器的对外发布接口时,用的是XmlRpcClient类的excute方法,调用这个方法是,指定服务端的对外发布接口是通过字符串的形式指的的,比如"Calculator.add",这样就很难在编译时检查服务端对象是否有这个方法,只有在运行时才会检测到,并且,传递的这个方法的参数是放在一个List或者Object[]中的,很容易将方法参数的顺序颠倒,这也只能在运行时才能检测到。

     

 

 

 

分享到:
评论

相关推荐

    php xml-rpc 协议 非常有用哦

    XML-RPC的全称是XML Remote Procedure Call,即XML远程方法调用。  它是一套允许运行在不同操作系统、不同环境的程序实现基于Internet过程调用的规范和一系列的实现。

    xml-rpc协议资料

    xml-rpc 是一套规范及其一系列的实现,允许运行在不同操作系统、不同环境的程序基于internet进行远程过程调用。  这种远程过程调用使用http作为传输协议,xml作为传送信息的编码格式。Xml-Rpc的定义尽可能的保持了...

    使用 XML-RPC 为 C++ 应用程序启用 Web 服务

    简单对象访问协议(Simple Object Access Protocol,SOAP)、代表性状态传输(Representational State Transfer,REST)以及 XML 远程过程调用协议(XML Remote Procedure Call,XML-RPC)等 Web 服务协议可帮助将...

    php xml-rpc远程调用

    从网上找来的XML-RPC库,对于开发小型的外部通讯接口很有用,把这个代码保存为xml-rpc.inc.php

    WordPress 3.5禁用XML-RPC

    XML-RPC的全称是XML Remote Procedure Call,即XML远程方法调用。它是一套允许运行在不同操作系统、不同环境的程序实现基于Internet过程调用的规范和一系列的实现。 有些用户习惯用其他的第三方软件发布WordPress...

    用于Android的轻量级Java XML-RPC客户端源代码

    一个用于Android的轻量级Java XML-RPC客户端源代码,XML-RPC是用于远程过程调用的HTTP协议,以XML格式通讯。 如何包含它: 1)可以将src目录下的源代码包含到你的项目里。 2)编译为库 可以用NetBeans或ant编译...

    Android-对OkHttp3请求库简单封装适配Json-Rpc调用协议

    json-rpc是基于json的跨语言远程调用协议,比xml-rpc、webservice等基于文本的协议传输数据格小;相对hessian、java-rpc等二进制协议便于调试、实现、扩展,是非常优秀的一种远程调用协议。

    用Java实现SOAP的XML文档网络传输及远程过程调用(RPC)

    用Java实现SOAP的XML文档网络传输及远程过程调用(RPC)

    用Java实现基于SOAP的XML文档网络传输及远程过程调用(RPC).

    用Java实现基于SOAP的XML文档网络传输及远程过程调用(RPC).

    JsonRpc2.0 源码

    son-rpc是基于json的跨语言远程调用协议,比xml-rpc、webservice等基于文本的协议传输数据格小;相对hessian、java-rpc等二进制协议便于调试、实现、扩展,是非常优秀的一种远程调用协议

    mql5-rpc:MetaTrader 5 的 MQL5-RPC 客户端库

    mql5-rpc 一个支持从 MetaTrader 5 到外部 XML-RPC 服务的远程过程调用的库。

    XML-RPC for C/C++ (Xmlrpc-c)-开源

    用于使用C或C ++编写XML-RPC服务器或客户端的编程库。 XML-RPC是一种标准的网络协议,它允许客户端程序对服务器进行简单的远程过程调用(RPC)类型的请求。 类似于SOAP或CORBA,但要简单得多。

    axmlrpc:带有轻量级 XML-RPC 客户端的 Java 库

    XML-RPC 是一种规范,用于以 XML 格式通过 HTTP 协议进行远程过程调用。 该规范可以在下。 该库是为与 Android 一起使用而开发的。 由于它不依赖于任何 Android 库或任何其他 3rd 方库,因此它在任何常见的 Java ...

    Python中实现远程调用(RPC、RMI)简单例子

    RPC属于函数级别的远程调用,其多是通过HTTP传输数据,数据形式有XML、JSON、序列化数据等。在此,用python做一个xml-rpc的示例。 先给服务器端server.py:复制代码 代码如下:from SimpleXMLRPCServer import ...

    xenserver 6.5 SDK_zh-cn 中文 API

    虽然可以直接通过原始 XML-RPC 调用编写使用 XenServer 管理 API 的应用程序,但通过使用 语言绑定将各 API 调用显示为目标语言中的第一类函数,可以大大简化第三方应用程序开发工作。 XenServer SDK 可为 C、C#、...

    Netty4.1实战-手写RPC框架.pdf

    RPC是一种远程调用的通信协议,例如dubbo、thrift等,我们在互联网高并发应用开发时候都会使用到类似的服务。本专题主要通过三个章节实现一个rpc通信的基础功能,来学习RPC服务中间件是如何开发和使用。章节内以源码...

    ocaml-rpc:轻型库可处理OCaml中的RPC

    OCaml-RPC-远程过程调用(RPC)库 ocaml-rpc是一个库,提供使用XML或JSON作为传输编码的远程过程调用(RPC)。 传输机制本身不在此库的范围内,因为所有转换都是从字符串到字符串的。 odoc生成的文档可在。 RPC类型 ...

    用Java实现基于SOAP的XML文档网络传输及远程过程调用(RPC)

    用Java实现基于SOAP的XML文档网络传输及远程过程调用(RPC)

    移动博客发布器通过xml_rpc达成远程过程调用

    在web2.0时 代,使用博客的人越来越多,人们经常通过博客来抒发情感,编写日记,记录生活点滴 本范例实现一个移动博客发布器,示范如何从手机发布文章至博客

Global site tag (gtag.js) - Google Analytics