`

Java RPC通信机制之XML-RPC:Apache XML-RPC 3.0开发简介

阅读更多


摘要:

XML-RPC 是一种简单的,轻量级的通过 HTTP 协议进行 RPC 通信的规范。本文以 Apache XML-RPC 3.0 为基础,对 XML-RPC 的基本原理及 Apache XML-RPC 3.0 的主要特性进行了讨论和分析。

正文:

一、概述

XML-RPC 是一种简单的,轻量级的通过 HTTP 协议进行 RPC 通信的规范。一个 XML-RPC 消息就是一个请求体为 XML HTTP-POST 请求,被调用的方法在服务器端执行并将执行结果以 XML 格式编码后返回。

以下是通过 ethereal 抓到的一个典型的 XML-RPC 调用包(为便于阅读,进行了格式化):

POST /xmlrpc HTTP/1.1

Content-Type: text/xml

User-Agent: Apache XML RPC 3.0 (Jakarta Commons httpclient Transport)

Host: 135.252.156.147:8080

Content-Length: 260

<? xml version = "1.0 " encoding = "UTF-8 "?>

< methodCall xmlns:ex = "http://ws.apache.org/xmlrpc/namespaces/extensions ">

      < methodName > Calculator.add</ methodName >

      < params >

            < param >

                  < value >

                        < i4 > 2</ i4 >

                  </ value >

            </ param >

            < param >

                  < value >

                        < i4 > 3</ i4 >

                  </ value >

            </ param >

      </ params >

</ methodCall >

而对应的返回数据包为:

HTTP/1.1 200 OK

Server: Apache XML-RPC 1.0

Connection: close

Content-Type: text/xml

Content-Length: 189

<? xml version = "1.0 " encoding = "UTF-8 "?>

< methodResponse xmlns:ex = "http://ws.apache.org/xmlrpc/namespaces/extensions ">

      < params >

            < param >

                  < value >

                        < i4 > 5</ i4 >

                  </ value >

            </ param >

      </ params >

</ methodResponse >

其格式很简单,几乎是不言自明的,分别用 methodCall methodResponse 标签标识发送给 Server 的调用请求和 Server 的返回结果,请求方法的名称用 methodName 标识,参数用 params param 标识,而参数的类型标签则如下表所示:

Tag

Java Type

说明

<i4> or <int>

Integer/int

4 字节带符号整数值

<boolean>

Boolean

0 (false) or 1 (true)

<string>

String

字符串

<double>

Double

双精度带符号浮点值

<dateTime.iso8601>

java.util.Date

日期 / 时间

<base64>

byte[]

base64 编码的二进制数据

<struct>

java.util.Map

键值对,键为 String 类型,而值为任意有效类型

<array>

Object[]

java.util.List

对象数组

二、举例

下面举一个实际运用 XML-RPC 进行 RPC 调用的例子, XML-RPC 规范有多种针对不同语言的实现,这里我们使用的是 Apache XML-RPC3.0RC1

在开始之前,需到 http://jakarta.apache.org/commons/index.html 下载如下程序包:

commons-codec-1.3 (通用编码 / 解码算法实现,可参考 http://www.devx.com/Java/Article/29795/1954?pf=true http://jakarta.apache.org/commons/codec/userguide.html 来获得该软件包的详细信息)

commons-httpclient-3.0.1 HTTP 协议的客户端编程工具包,详细介绍见 http://www-128.ibm.com/developerworks/cn/opensource/os-httpclient/

将上述通用工具包解压后,拷贝其中的 jar 文件到 XML-RPC 解压目录的 dist 目录中。

并添加如下环境变量:

XMLRPC_HOME      XML-RPC 的解压目录

XMLRPC_LIB        %XMLRPC_HOME%/dist

XMLRPCCLASSPATH      %XMLRPC_LIB%/xmlrpc-common-3.0rc1.jar;%XMLRPC_LIB%/xmlrpc-server-3.0rc1.jar;%XMLRPC_LIB%/xmlrpc-client-3.0rc1.jar;%XMLRPC_LIB%/commons-httpclient-3.0.1.jar;%XMLRPC_LIB%/commons-codec-1.3.jar

 

整个应用很简单,通过 XML-RPC 调用 Server 端提供的 HelloHandler.sayHello 方法回显一个字符串信息。下面是 HelloHandler 接口及其实现类相关代码:

// Hello Handler.java

package demo.xmlrpc;

 

public interface H elloH andler {

      public String sayHello(String str );

}

 

// Hello HandlerImpl.java

package demo.xmlrpc;

 

public class H elloH andlerImpl implements Hello Handler {

      public String sayHello(String str){

            return "Hello, " + str + "!" ;

      }

}

以下是对应的 Server 端源代码:

// Server1 .java

package demo.xmlrpc;

 

import java.io.IOException;

import java.io.OutputStream;

import javax.servlet.ServletConfig;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

import org.apache.xmlrpc.XmlRpcException;

import org.apache.xmlrpc.server.PropertyHandlerMapping;

import org.apache.xmlrpc.server.XmlRpcServerConfigImpl;

import org.apache.xmlrpc.webserver.XmlRpcServletServer;

 

public class Server 1 extends HttpServlet {

      private XmlRpcServletServer server;

     

      public void init(ServletConfig pConfig) throws ServletException {

            super.init(pConfig);

            try {

                  // create a new XmlRpcServletServer object

                  server = new XmlRpcServletServer();

                  // set up handler mapping of XmlRpcServletServer object

                  PropertyHandlerMapping phm = new PropertyHandlerMapping();

                  phm.addHandler(" HelloH andler" , Hello Handler Impl .class );                 

                  server.setHandlerMapping(phm);

                  // more config of XmlRpcServletServer object     

                  XmlRpcServerConfigImpl serverConfig = (XmlRpcServerConfigImpl)server.getConfig();

                  serverConfig.setEnabledForExtensions(true );

                  serverConfig.setContentLengthOptional(false );

            } catch (XmlRpcException e) {

                  try {

                        log("Failed to create XmlRpcServer: " + e.getMessage(), e);

                  } catch (Throwable ignore) {

                  }

                  throw new ServletException(e);

            }

      }

     

      public void doPost(HttpServletRequest pRequest, HttpServletResponse pResponse)

            throws IOException, ServletException {

            server.execute(pRequest, pResponse);

      }

}

以下是对应的 Client 端源代码:

// Client1 .java

package demo.xmlrpc;

 

import java.io.IOException;

import java.net.MalformedURLException;

import java.util.Vector;

import java.net.URL;

 

import org.apache.xmlrpc.XmlRpcException;

import org.apache.xmlrpc.client.XmlRpcClient;

import org.apache.xmlrpc.client.XmlRpcClientConfigImpl;

 

public class Client 1 {

      public static void main(String[] args) {

            try {

                  // config client

                  XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();

                  config.setServerURL(new URL("http://localhost:8080/jsp/XmlRpcServer" ));      // should be modified according to your configuration of jsp container

                  // create a new XmlRpcClient object and bind above config object with it

                  XmlRpcClient client = new XmlRpcClient();

                  client.setConfig(config);

                  // create parameter list

                  Vector <String> params = new Vector <String> ();

                  params.addElement("Tom" );

                  // execute XML-RPC call

                  String result = (String) client.execute(" HelloH andler.sayHello" , params);                 

                  System.out.println(result);

            } catch (MalformedURLException e) {

                  System.out.println(e.toString());

            } catch (XmlRpcException e) {

                  System.out.println(e.toString());

            } catch (IOException e) {

                  e.printStackTrace();

            }

      }

}

程序源码中已包含了详细的注释,这里就不作过多解释了。但需注意 XmlRpcDemo_Client 中的 ServerURL 信息应根据自己的的 jsp 容器的配置作相应调整,并需设置相应的 servlet-mapping 信息,在我的 jsp 目录( Tomcat5.5 Context 之一)下的 WEB_INF/web.xml 文件中存在如下的 servlet-mapping 信息:

< servlet >

      < servlet-name > XmlRpcServer</ servlet-name >

      < servlet-class > demo.xmlrpc.Server1</ servlet-class >

</ servlet >

< servlet-mapping >

      < servlet-name > XmlRpcServer</ servlet-name >

      < url-pattern > /XmlRpcServer</ url-pattern >

</ servlet-mapping >

并且,上述 Server1.class 及其他相关类文件已被拷贝到 jsp\WEB-INF\classes\demo\xmlrpc 目录下。

在启动 Tomcat 并执行

java -classpath %CLASSPATH%;%XMLRPCCLASSPATH% demo.xmlrpc.Client1.java

前,你应该将 %XMLRPC_HOME%/dist %XMLRPC_HOME%/lib 下的几个 jar 文件( source 就不用拷了)及前面下载的 commons-codec-1.3.jar 拷贝到 %TOMCAT_HOME%/common/lib jsp\WEB-INF\lib 下。

Note :除了上面这种方式,你可以无需编写任何 Server 端代码,仅通过简单配置完成上述功能,具体可参考: http://ws.apache.org/xmlrpc/server.html

接下来,作为比较,我们来看看 XML-RPC2.0 中应该如何实现上述功能。

以下是 2.0 版的 Server 程序:

// Server2 .java

package demo.xmlrpc;

 

import java.io.IOException;

import java.io.OutputStream;

 

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

font-fam

分享到:
评论

相关推荐

    Java RPC通信机制之XML-RPC

    XML-RPC(Remote Procedure Call over XML)是一种轻量级的远程过程调用协议,它允许软件通过网络进行通信,调用远程服务器上的函数,就像调用本地函数一样。XML-RPC 使用 XML 来编码其调用结构,并使用 HTTP 作为...

    apache-jmeter-3.0.zip和apache-jmeter-3.0_src.zip

    标题提到的两个压缩包文件分别是"apache-jmeter-3.0.zip"和"apache-jmeter-3.0_src.zip",它们代表了JMeter 3.0的不同版本。 1. **apache-jmeter-3.0.zip**:这是一个二进制发行版,包含了预编译的JMeter程序,用户...

    xml_rpc需要的jar包

    3. **commons-httpclient-3.0-rc4.jar**:Apache HttpClient是一个实现了HTTP协议的客户端编程工具包,用于支持XML-RPC的HTTP通信。它提供了对HTTP协议的高级支持,如连接管理、重试策略、身份验证等,使得XML-RPC...

    Apache xml-rpc入门

    Apache XML-RPC 是一个基于Java的开源XML-RPC服务器和客户端库。它提供了强大的功能,支持多种数据类型,并能够轻松集成到现有的Java应用程序中。 ##### 1. 数据类型支持 Apache XML-RPC 支持以下几种基本的数据...

    apache XML-RPC

    Apache XML-RPC(XML Remote Procedure Call)是一种基于XML的远程过程调用协议,它允许不同的计算机之间通过网络进行通信,仿佛它们之间的函数调用一样。这个技术被广泛应用于分布式系统和跨平台通信,尤其是在Java...

    xml-rpc学习心得

    - **XmlRpcLocalTransportFactory**:内嵌了一个XML-RPC服务器,可通过直接的Java调用来使用,适合于调试和开发环境。 #### 五、XML-RPC服务端概述 服务端的核心组件是`XmlRpcServer`对象,它负责处理来自客户端的...

    XML-RPC.rar_HTTP协议_XML-R_XML-RPC _xml rpc

    简单介绍了XML-RPC这种通过HTTP协议进行RPC通信的规范。 以Apache XML-RPC 3.0为基础,对XML-RPC的基本原理及Apache XML-RPC 3.0的主要特性进行了讨论和分析

    Apache的XML-RPC简化你的WebService应用

    Apache XML-RPC库为Java、Python、Perl等多种语言提供了API,使得开发者可以轻松地在这些平台上实现XML-RPC通信。以下是一些基本步骤: 1. **服务端配置**:创建一个实现了特定接口的类,这个接口定义了可供远程...

    Java的XML-RPC函数库源代码

    在Java中,Apache提供了一个名为XML-RPC的库,使得开发人员能够轻松地实现XML-RPC客户端和服务端的功能。这个库的特点是轻量级、易于使用,适合构建分布式系统中的简单通信。 标题"Java的XML-RPC函数库源代码"表明...

    Java RPC通信机制之SOAP:应用Apache Axis进行Web Service开发

    总结来说,Java RPC中的SOAP通信机制结合Apache Axis工具,为开发Web服务提供了一个强大的框架。通过XML和HTTP,SOAP实现了跨平台、跨语言的通信,同时允许灵活的扩展以满足特定的安全和功能需求。在实际项目中,...

    javax.xml.rpc

    "javax.xml.rpc"是Java平台中的一个关键组件,主要用于实现基于XML的远程过程调用(XML-RPC)服务。这个框架允许Java应用程序通过HTTP协议来调用远程服务器上的方法,从而实现分布式计算。在Java EE环境中,它常与...

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

    1. **选择库**:选择一个合适的 XML-RPC 库,如 Apache Thrift 或 XMLRPC-EPI。这些库提供了 C++ API,使得在 C++ 应用程序中实现 XML-RPC 成为可能。 2. **定义服务接口**:定义要公开为 Web 服务的 C++ 函数或方法...

    java XML-PRC 类库

    Java XML-RPC(Remote Procedure Call)类库是一种在分布式环境中实现客户端和服务器间通信的技术,尤其适用于基于XML的数据交换。这个技术允许Java应用程序通过HTTP协议调用远程服务器上的方法,就像调用本地方法...

    apache xml rpc client

    总结来说,Apache XML-RPC客户端是Java开发者实现远程调用的一种实用工具,通过简单的API可以轻松地与支持XML-RPC的服务器进行通信。理解并掌握其工作原理和使用方法,有助于构建分布式系统中的通信层,提高开发效率...

    apache XML-RPC 实现

    commons-logging-1.1.jar ws-commons-util-1.0.2.jar xmlrpc-client-3.1.3.jar xmlrpc-common-3.1.3.jar xmlrpc-server-3.1.3.jar

    xml-rpc.rar_rpc visual basic_vb6 soap webservi_vb6 xml rpc_xml

    6. **XML-RPC库**:为了在VB6中使用XML-RPC,开发者可能需要引入第三方库,如Apache Axis或Microsoft的.NET Framework中的System.Web.Services组件。这些库提供了用于序列化和反序列化XML-RPC请求和响应的方法。 7....

    Apache xmlrpc 3.1 with examples

    - `example`目录可能包含了Apache XML-RPC 3.1的实践示例,包括客户端和服务端的代码,可以作为学习和开发的起点。 - 客户端示例可能展示如何调用远程方法,传递参数,处理返回结果。 - 服务端示例可能展示如何...

    wordpress-java:Java库使用Wordpress的xml-rpc功能

    标题中的“wordpress-java:Java库使用Wordpress的xml-rpc功能”表明这是一个关于使用Java语言与WordPress交互的项目,主要依赖于XML-RPC协议。XML-RPC(远程过程调用)是一种轻量级的网络通信协议,允许客户端通过...

Global site tag (gtag.js) - Google Analytics