`
coolpep
  • 浏览: 80600 次
社区版块
存档分类
最新评论

xml rpc是什么

 
阅读更多

1.xml rpc是什么
1.1. xml rpc简介
xml rpc是使用http协议做为传输协议的rpc机制,使用xml文本的方式传输命令和数据。
一个rpc系统,必然包括2个部分:1.rpc client,用来向rpc server调用方法,并接收方法的返回数据;2.rpc server,用于响应rpc client的请求,执行方法,并回送方法执行结果。
1.2. xml rpc的可用版本
xml rpc client和xml rpc server都有很多版本的实现。一般而言,一个实现版本都会同时实现client/server。但由于都满足xml rpc规范,从理论上讲,任何一个版本的rpc client实现与任何一个版本的rpc server都能配套使用。
更进一步,由于xml rpc以xml文本的方式,使用http协议传输,所以与编程语言无关。例如:rpc client的已实现版本包括了:perl,php,python,c/c++,java,等等;rpc server的实现语言包括perl,java,等。
同一种编程语言所实现的版本也不止一个。例如java版的实现有:Marque的xmlrpc实现(http://xmlrpc.sourceforge.net/),apache的xmlrpc 实现(http://ws.apache.org/xmlrpc/)

1.3.xmlrpc的工作原理
完整的需要参考xmlrpc规范(http://www.xmlrpc.com/spec)
简单描述:
rpcclient的工作原理:rpcclient根据URL找到rpcserver -> 构造命令包,调用rpcserver上的某个服务的某个方法 -> 接收到rpcserver的返回,解析响应包,拿出调用的返回结果。
rpcserver的工作原理:启动一个webserver(在使用内置的webserver的情况下) -> 注册每个能提供的服务,每个服务对应一个Handler类 ->进入服务监听状态。
1.4. xmlrpc规范
区区6页,讲的非常清楚,建议细看。http://www.xmlrpc.com/spec

2.在java中使用xml rpc的几个例子
2.0.环境准备:下载如下包并设置到CLASSPATH中
apache xmlrpc软件包(http://ws.apache.org/xmlrpc/)
commons-httpclient-3.0-rc4.jar
commons-codec-1.3.jar
2.1.使用apache的java xmlrpc实现版本,实现简单的加/减服务。参考附录中test.XmlRPCClient类与test.JavaServer类
2.2.使用apache的java xmlrpc实现版本,测试java的数据类型与xmlrpc数据类型的相互对应关系。参考附录中test2.XmlRPCClient类与test2.JavaServer类。
在这里简单描述一下:
>xmlrpc中的Array类型,对应到java中的Vector类型
例如:在RPC Server中的某个服务方法的返回值的声明类型是String[],但在Client中接收到的将是Vector对象;
反之,如果Client传送过去的调用参数为String[],但在RPC Server中所接收到的将是Vector对象
当然,如果我们不使用String[],直接声明为Vector,也是可以的。
>xmlrpc中的struct类型,对应到java中的Hashtable类型
>其它的类型,如:String,int,double,boolean,Date等,都比较好对应。需要注意的是:在rpc Client中,如果使用到int/double/boolean这些基本类型时,需要将他们封装成一个相应的Object,例如:Integer/Double/Boolean。

2.3.使用apache的java xmlrpc实现版本,实现自定义类型的数据的传输
这个sample中,假设所传输的object都实现了XmlRPCSerializable接口。这个例子的目的是:模拟unionmon中的command对象。当假设所传输的数据是一个Object[]时,可以用这种方式传输。结合unionmon中的代码生成机制,每个vo的序列化/反序列化方法可以在代码生成过程中完成。同样地,vox的序列化/反序列化方法需要手写。
参考代码:附录中的test3.XmlRPCSerializable , test3.AccountVO , test3.XmlRPCClient , test3.JavaServer

2.4.不启动内置的WebServer,让tomcat支持rpc server。
做法:1.实现一个Servlet,并配置到tomcat中;2.让rpc client直接找这个servlet,获得服务。
注意rpc client使用的是http post方法,所以该servlet中只需要实现doPost方法。

过程:在tomcat中的web.xml增加如下配置:
<servlet>
<servlet-name>SampleServiceServlet</servlet-name>
<servlet-class>test4.ServletXmlRPCServer</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>SampleServiceServlet</servlet-name>
<url-pattern>/SampleServiceServlet</url-pattern>
</servlet-mapping>

参考类:附件中的test4.SampleService,test4.ServletXmlRPCServer,test4.XmlRPCClient

3.todolist
3.1.能否通过introspect方式,使得自定义类型的vo的序列化/反序列化工作自动完成.castor可以完成对象的xml binding,似乎可参考
3.2.soap协议比xmlrpc复杂并强大。soap不熟悉。另,soap一定与web service在一起用?能否不用web service,但使用soap做rmi的协议。


4.附录
4.1.附录1 xmlrpc所支持的数据类型(略)
4.2.附录2 xmlrpc数据类型与java语言的数据类型的映射(略)
4.3.参考资料
http://xmlrpc.sourceforge.net/ --Marque的xmlrpc实现
http://ws.apache.org/xmlrpc/ apache上xmlrpc server的实现
http://xmlrpc-c.sourceforge.net/xmlrpc-howto/xmlrpc-howto.html xmlrpc howto
http://www.sentom.net/list.asp?id=80 xml-rpc之实例
http://www.xmlrpc.com/spec xmlrpc规范
4.4.相关代码
//********************************* begin test.XmlRPCClient ************************************//
package test;
import java.util.*;
import org.apache.xmlrpc.*;
public class XmlRPCClient {
// The location of our server.
private final static String server_url =
"http://localhost:9001";
public static void main(String[] args) throws Exception{
XmlRpc.debug = true;
// Create an object to represent our server.
XmlRpcClient server = new XmlRpcClient(server_url);

// Build our parameter list.
Vector params = new Vector();
params.addElement(new Integer(5));
params.addElement(new Integer(3));

// Call the server, and get our result.
Hashtable result = (Hashtable) server.execute("mysample.sumAndDifference",
params);
int sum = ( (Integer) result.get("sum")).intValue();
int difference = ( (Integer) result.get("difference")).intValue();
System.out.println("Sum: " + Integer.toString(sum) +
", Difference: " +
Integer.toString(difference));
}
}
//********************************* end test.XmlRPCClient ************************************//

//********************************** begin test.JavaServer ************************************//

package test;

import java.util.*;
import org.apache.xmlrpc.WebServer;

public class JavaServer {

public JavaServer() {
}

public Hashtable sumAndDifference(int x, int y) {
Hashtable result = new Hashtable();
result.put("sum", new Integer(x + y));
result.put("difference", new Integer(x - y));
return result;
}

public static void main(String[] args) {
try {
// Invoke me as <http://localhost:9001/RPC2>.
WebServer webserver = new WebServer(9001);
webserver.addHandler("mysample", new JavaServer());
webserver.start();
}
catch (Exception exception) {
System.err.println("JavaServer: " + exception.toString());
}
}
}

//********************************** end test.JavaServer ************************************//


//********************************** begin test2.XmlRPCClient ************************************//

package test2;

import java.util.*;
import org.apache.xmlrpc.*;
public class XmlRPCClient {

// The location of our server.
private final static String server_url =
"http://localhost:9001";

public static void main(String[] args) {
try {
XmlRpc.debug = true;
XmlRpcClient server = new XmlRpcClient(server_url);
// Build our parameter list.
Vector params = new Vector();
Vector arg0 = new Vector();
arg0.add("army");
arg0.add("robin");
params.addElement(arg0);
Hashtable arg1 = new Hashtable();
arg1.put("a","a");
arg1.put("b","b");
params.addElement(arg1);
Integer arg2 = new Integer(3);
params.addElement(arg2);
Double arg3 = new Double(11.33);
params.addElement(arg3);
Boolean arg4 = new Boolean(false);
params.addElement(arg4);
Date arg5 = Calendar.getInstance().getTime();
params.addElement(arg5);
// Call the server, and get our result.
Object ret = server.execute("sample.getAllUser",params);
Vector result = (Vector)ret;
if(result!=null){
System.out.println("result:" + result.size() + "records");
for(int i=0;i<result.size();i++){
System.out.println("result " + i + "is:" + result.get(i));
}
}
}
catch (XmlRpcException exception) {
System.err.println("XmlRPCClient: XML-RPC Fault #" +
Integer.toString(exception.code) + ": " +
exception.toString());
}
catch (Exception exception) {
exception.printStackTrace(System.err);
}
}
}

//*********************** end test2.XmlRPCClient *********************************//

//*********************** begin test2.JavaServer*********************************//


package test2;
import java.util.*;
import org.apache.xmlrpc.WebServer;
public class JavaServer {

public JavaServer () {
// Our handler is a regular Java object. It can have a
// constructor and member variables in the ordinary fashion.
// Public methods will be exposed to XML-RPC clients.
}

public Vector getAllUser (Vector arg0,Hashtable arg1,int arg2,double arg3,boolean arg4,Date arg5) {
if(arg0!=null){
System.out.println(arg0.size());
}
if(arg1!=null){
System.out.println(arg1.size());
}
System.out.println(arg2);
System.out.println(arg3);
System.out.println(arg4);
System.out.println(arg5);
Vector result = new Vector();
result.add("bruce");
result.add("测试中文");
result.add("orbison");
return result;
}

public static void main (String [] args) {
try {

// Invoke me as <http://localhost:9001/RPC2>.
WebServer webserver = new WebServer(9001);

webserver.addHandler("sample", new JavaServer());
webserver.start();
} catch (Exception exception) {
System.err.println("JavaServer: " + exception.toString());
}
}
}

//*********************** end test2.JavaServer *********************************//

//********************* begin test3.XmlRPCSerializable ****************************//
package test3;
import java.util.Vector;
public interface XmlRPCSerializable {
/*将本对象序列化为Vector对象*/
public Vector serialize();
/*从v中反序列化本对象*/
public void deSerialize(Vector v);
}

//******************** end test3.XmlRPCSerializable **********************//

//******************** begin test3.AccountVO *********************//
package test3;
import java.util.*;

public class AccountVO implements XmlRPCSerializable{
private String acctId;
private double balance;
public AccountVO() {
}

public String toString(){
return "acctId:" + acctId + ",balance:" + balance;
}
public Vector serialize(){
Vector v = new Vector();
v.add(acctId);
v.add(new Double(balance));
return v;
}

public void deSerialize(Vector v){
acctId = (String)v.get(0);
balance = ((Double)v.get(1)).doubleValue();
}

public String getAcctId() {
return acctId;
}
public void setAcctId(String acctId) {
this.acctId = acctId;
}
public double getBalance() {
return balance;
}
public void setBalance(double balance) {
this.balance = balance;
}

}

//************************ end test3.AccountVO *************************//

//************************ begin test3.XmlRPCClient*************************//
package test3;

import java.util.*;
import org.apache.xmlrpc.*;

public class XmlRPCClient {

// The location of our server.
private final static String server_url =
"http://localhost:9001";

public static void main(String[] args) {
try {
XmlRpc.debug = false;
// Create an object to represent our server.
XmlRpcClient server = new XmlRpcClient(server_url);

// Build our parameter list.
Vector params = new Vector();

// Call the server, and get our result.
Vector result = (Vector) server.execute("mysample.getAllAccountVO",
params);
if (result != null) {
for (int i = 0; i < result.size(); i++) {
Vector v = (Vector) result.get(i);
AccountVO vo = new AccountVO();
vo.deSerialize(v);
System.out.println(vo);
}
}

}
catch (XmlRpcException exception) {
System.err.println("XmlRPCClient: XML-RPC Fault #" +
Integer.toString(exception.code) + ": " +
exception.toString());
}
catch (Exception exception) {
exception.printStackTrace();
}
}
}

//************************ end test3.XmlRPCClient*************************//

//************************ begin test3.JavaServer*************************//
package test3;
import java.util.*;
import org.apache.xmlrpc.WebServer;
public class JavaServer {

public JavaServer () {
}

public Vector getAllAccountVO () {
Vector result = new Vector();
AccountVO vo = new AccountVO();
vo.setAcctId("robin");
vo.setBalance(300000.00);
result.add(vo.serialize());
vo = new AccountVO();
vo.setAcctId("amy");
vo.setBalance(100000.10);
result.add(vo.serialize());
return result;
}

public static void main (String [] args) {
try {

// Invoke me as <http://localhost:9001/RPC2>.
WebServer webserver = new WebServer(9001);
webserver.setParanoid (true);
// deny all clients
webserver.acceptClient ("192.168.0.*"); // allow local access
webserver.denyClient ("192.168.0.3"); // except for this one
webserver.setParanoid (false); // disable client filter

webserver.addHandler("sample", new JavaServer());
webserver.addHandler("mysample",new JavaServer());
webserver.start();
} catch (Exception exception) {
System.err.println("JavaServer: " + exception.toString());
}
}
}

////////////////////////end test3.JavaServer//////////////////////////////////

//************************ end test3.JavaServer*************************//

//************************ begin test4.SampleService*************************//
package test4;
import java.util.*;
public class SampleService {
public SampleService() {
}

public Date currentTime(){
return Calendar.getInstance().getTime();
}

}
////////////////////////end test4.SampleService//////////////////////////////////

////////////////////////begin test4.ServletXmlRPCServer//////////////////////////////////
package test4;

import java.io.*;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import org.apache.xmlrpc.*;

public class ServletXmlRPCServer
extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
XmlRpcServer xmlrpc = new XmlRpcServer();
xmlrpc.addHandler("sampleService", new SampleService());
byte[] result = xmlrpc.execute(request.getInputStream());
response.setContentType("text/xml");
response.setContentLength(result.length);
OutputStream out = response.getOutputStream();
out.write(result);
out.flush();
}

}
////////////////////////end test4.ServletXmlRPCServer//////////////////////////////////

//*********************** end test4.ServletXmlRPCServer **************************//

//*********************** begin test4.XmlRPCClient**************************//
package test4;


import java.util.*;
import org.apache.xmlrpc.*;

public class XmlRPCClient {

// The location of our server.
private final static String server_url =
"http://localhost:8080/axis/SampleServiceServlet";

public static void main (String [] args) {
try {
XmlRpc.debug = false;
// Create an object to represent our server.
XmlRpcClient server = new XmlRpcClient(server_url);
// Build our parameter list.
Vector params = new Vector();
// Call the server, and get our result.
Date result = (Date) server.execute("sampleService.currentTime", params);
System.out.println(result.getTime());

} catch (XmlRpcException exception) {
System.err.println("XmlRPCClient: XML-RPC Fault #" +
Integer.toString(exception.code) + ": " +
exception.toString());
} catch (Exception exception) {
System.err.println("XmlRPCClient: " + exception.toString());
}
}
}

//***********************end test4.XmlRPCClient**************************//

分享到:
评论

相关推荐

    LabVIEW XML-RPC

    LabVIEW XML-RPC 是一种基于XML的远程过程调用(RPC)技术,它允许LabVIEW应用程序与其他支持XML-RPC协议的系统进行通信。这个技术在跨平台交互和分布式系统开发中发挥着重要作用,使得LabVIEW可以与不同编程语言...

    javax.xml.rpc

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

    javax.xml.rpc相关jar包

    描述中提到的“解决javax.xml jar包缺失的问题,引进javax.xml.rpc-api-1.1.1.jar”,意味着在开发或运行某个Java项目时,可能会遇到由于缺少`javax.xml.rpc`相关的jar包导致的编译或运行错误。为了解决这个问题,...

    XML-RPC.rar_python xml rpc_python写xml_xml rpc_xml-rpc python

    在这个"XML-RPC.rar"压缩包中,包含了一系列Python实现的XML-RPC相关文件,包括server.py、readfile.py、client.py和D_H.py,这些都是实现XML-RPC服务端和客户端功能的关键代码。 首先,我们来看`server.py`。这个...

    xml rpc 例子

    XML RPC使用XML作为其数据交换格式,使得不同编程语言之间的互操作性变得可能。 在"XmlRpcTest 工程"中,我们可以看到这是一个针对XML RPC 2.0版本的测试项目。XML RPC 2.0相较于早期版本可能引入了更多的优化和...

    xml-rpc学习心得

    ### XML-RPC学习心得 #### 一、XML-RPC简介 XML-RPC(XML Remote Procedure Call)是一种轻量级的远程过程调用协议,它使用XML来编码调用数据,并通过HTTP进行传输。XML-RPC使得运行在不同操作系统上的应用程序...

    xml_rpc需要的jar包

    在Java环境中,XML-RPC的实现通常依赖于一些特定的库,如Apache XML-RPC项目提供的组件。在你给出的文件信息中,"xml_rpc"的标签以及提到的三个jar包,揭示了这个压缩包包含的是XML-RPC所需的基础库。 1. **commons...

    xml-rpc.rar_rpc visual basic_vb6 soap webservi_vb6 xml rpc_xml

    本压缩包“xml-rpc.rar”可能包含了一套用于VB6开发的XML-RPC库或示例代码,帮助开发者理解如何在VB6中集成XML-RPC功能。在VB6中实现XML-RPC主要涉及以下几个知识点: 1. **XML基础知识**:XML(Extensible Markup ...

    xml-rpc协议资料

    ### XML-RPC协议详解 #### 一、XML-RPC简介 **XML-RPC**(XML Remote Procedure Call)是一种轻量级的远程过程调用协议,它允许不同操作系统、不同环境中的程序通过Internet进行通信。XML-RPC使用HTTP作为传输协议...

    3.0 XML-RPC 官方示例+源码+官网地址资料.rar

    在3.0版本中,XML-RPC进一步提升了性能和安全性,使其成为分布式应用程序之间交互的一种实用方式。 XML-RPC的核心思想是简单:一个客户端通过发送一个包含方法名和参数的XML文档到服务器,服务器解析这个请求,执行...

    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 client

    Apache XML-RPC(XML Remote Procedure Call)是一种基于HTTP协议的RPC框架,允许客户端通过发送XML消息来调用服务器上的远程方法。它简化了分布式系统之间的通信,使得客户端和服务器可以跨语言、跨平台进行交互。...

    programming web services with xml rpc

    ### XML-RPC编程在Web服务中的应用 #### 引言:XML-RPC的引入与重要性 《Programming Web Services with XML RPC》这本书是为那些希望深入理解并掌握XML-RPC技术的专业人士准备的一份详尽指南。XML-RPC(XML ...

    XmlRpcClient.zip_xml_xml rpc_xmlrpc

    XML(RPC)是一种远程过程调用(Remote Procedure Call)协议,它使用XML作为其消息格式。这个技术允许软件运行在不同的系统上,通过网络进行通信,就像它们在同一个系统上运行一样。在Linux环境下,XML-RPC客户端通常...

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

    XML-RPC利用XML作为数据交换格式,提供了简单、跨平台的RPC解决方案,极大地简化了Web Service的应用开发。这篇博文将深入探讨Apache XML-RPC的原理、使用方法以及它如何简化Web Service应用的构建。 XML-RPC的核心...

    Apache xml-rpc入门

    ### Apache XML-RPC 入门知识点详解 #### 一、XML-RPC 概念与应用场景 **XML-RPC(XML Remote Procedure Call)**是一种轻量级的远程过程调用协议,它允许在不同操作系统和语言环境之间进行数据交换。XML-RPC 使用...

    XML-RPC客户端程序

    XML-RPC客户端测试程序 向XMLRPC服务器发送一个XML-RPC请求,以文本文件读取xml文件; 记录返回的数据到文件中; windows命令行程序,使用前请配置*.pln文件 askcyg@hotmail.com

Global site tag (gtag.js) - Google Analytics