1.什么是XML-RPC

RPC(Remote Procedure Call)就是相当于提供了一种“远程接口”来供外部系统调用,常用于不同平台、不同架构的系统之间互相调用。

XML-RPC(RPCXML Remote Procedure Call)是通过HTTP传输XML来实现远程过程调用的RPC,因为是基于HTTP、并且使用XML文本的方式传输命令和数据,所以兼容性更好,能够跨域不同的操作系统、不同的编程语言进行远程过程调用,凡有所得,必有所失,在兼容性好的同时速度也会慢下来。

一般一个RPC系统包括两个部分,RPC Client和RPC Server,Client向Server发送一个请求体为XML的HTTP POST请求,被调用的方法在Server端执行后将执行结果以XML格式返回,与平常的方法调用所不同就是接口“作用域”更大,并且多了一层数据的包装和转换(见本文最后的数据类型)。

2. XML-RPC实现

Apache XML-RPC是XML-RPC的一个Java实现,其底层是基于Helma的。

XML-RPC Server端

启动一个XML-RPC有两种方式,一种是集成在Web Servlet环境中,一般应用在Web环境;一种是启动独立的内嵌Web Server,内嵌的Web Server可以被嵌入到任意的Java应用中。

集成在Web Servlet

使用内嵌的Web Server

package org.cc11001100.xmlrpc;

import org.apache.xmlrpc.XmlRpcException;
import org.apache.xmlrpc.server.PropertyHandlerMapping;
import org.apache.xmlrpc.server.XmlRpcServerConfigImpl;
import org.apache.xmlrpc.server.XmlRpcStreamServer;
import org.apache.xmlrpc.webserver.WebServer; import java.io.IOException; public class XmlRpcServerDemo { public static void main(String[] args) throws IOException, XmlRpcException { WebServer webServer = new WebServer(8088); XmlRpcStreamServer xmlRpcServer = webServer.getXmlRpcServer(); // 调用映射相关配置
PropertyHandlerMapping propertyHandlerMapping = new PropertyHandlerMapping();
propertyHandlerMapping.load(Thread.currentThread().getContextClassLoader(), "xml-rpc.properties");
xmlRpcServer.setHandlerMapping(propertyHandlerMapping); // Server相关配置
XmlRpcServerConfigImpl xmlRpcServerConfig = (XmlRpcServerConfigImpl) xmlRpcServer.getConfig();
xmlRpcServerConfig.setEnabledForExceptions(true);
xmlRpcServerConfig.setContentLengthOptional(false); // 设置ACL
webServer.setParanoid(true);
webServer.acceptClient("127.0.0.1");
// webServer.denyClient("192.168.1.*"); webServer.start(); } }

xml-rpx.properties文件内容:

# XML-RPC配置文件

FooUtils = org.cc11001100.xmlrpc.FooUtils

XML-RPC Client端

客户端有两种调用方式,分别是同步调用和异步调用。

同步调用

package org.cc11001100.xmlrpc;

import org.apache.xmlrpc.XmlRpcException;
import org.apache.xmlrpc.client.XmlRpcClient;
import org.apache.xmlrpc.client.XmlRpcClientConfigImpl; import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList; public class XmlRpcClientDemo { public static void main(String[] args) throws XmlRpcException, MalformedURLException { final String RPC_SERVER = "http://127.0.0.1:8088"; XmlRpcClient xmlRpcClient = new XmlRpcClient(); // 客户端相关配置
XmlRpcClientConfigImpl xmlRpcClientConfig = new XmlRpcClientConfigImpl();
xmlRpcClientConfig.setServerURL(new URL(RPC_SERVER));
xmlRpcClient.setConfig(xmlRpcClientConfig); // 调用Server端方法
String result = (String) xmlRpcClient.execute("FooUtils.sayHello", new ArrayList());
System.out.println(result); } }

异步调用

比如某个被调用的远程过程执行的很慢,就可能会导致我们的程序处于假死状态,又或者我们只是调用它一下,对其返回结果并不是很关心,这个时候比较适合使用异步调用。

XML-RPC数据类型

Tag    Java Type Describe
<i4> | <int> Integer/int 4字节带符号整数值
<boolean> Boolean    0==false, 1==true
<string> String    字符串
<double> Double    双精度带符号浮点值
<dateTime.iso8601> java.util.Date    日期/时间
<base64> byte[] base64编码的二进制数据
<struct> java.util.Map <K,V>对,key必须是string类型,value可以是任意其它类型,struct是可以递归使用的
<array> java.lang.Object[] | java.util.List    对象数组

参考资料:

1. Apache XML-RPC http://ws.apache.org/xmlrpc/xmlrpc2/

2. JSON-RPC(使用JSON格式的RPC)

XML-RPC笔记的更多相关文章

  1. XML学习笔记

    XML学习笔记 第一部分:XML简介 我们经常可以听到XML.HTML.XHTML这些语言,后两者比较清楚,一直不是很明白XML是什么,这里做一个总结. XML(eXtensible Markup L ...

  2. mybatis-config.xml简单笔记

    mybatis-config.xml简单笔记 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE ...

  3. applicationContext.xml简单笔记

    applicationContext.xml简单笔记 <?xml version="1.0" encoding="UTF-8"?> <bean ...

  4. 什么是XML RPC?

    # -*- coding: cp936 -*- #python 27 #xiaodeng #什么是XML RPC? #中文叫:远程过程调用 #使用http协议做传输协议的rpc机制,使用xml文本的方 ...

  5. The type javax.xml.rpc.ServiceException cannot be resolved.It is indirectly

    The type javax.xml.rpc.ServiceException cannot be resolved.It is indirectly 博客分类: 解决方案_Java   问题描述:T ...

  6. delphi操作xml学习笔记 之一 入门必读

    Delphi 对XML的支持---TXMLDocument类       Delphi7 支持对XML文档的操作,可以通过TXMLDocument类来实现对XML文档的读写.可以利用TXMLDocum ...

  7. XML学习笔记7——XSD实例

    在前面的XSD笔记中,基本上是以数据类型为主线来写的,而在我的实际开发过程中,是先设计好了XML的结构(元素.属性),并写好了一份示例,然后再反过来写XSD文件(在工具生成的基础上修改),也就是说,是 ...

  8. XML学习笔记6——XPath语言

    在上一篇笔记的结尾,我们接触到了两个用于选择XML文档中特定范围的元素<selector>和<field>,这两个元素的取值都是XPath表达式,那么,什么是XPath呢?简单 ...

  9. XML学习笔记5——XSD复杂数据类型

    和简单数据类型对应就是复杂数据类型了,XML元素的数据类型可以是简单数据类型,也可以是复杂数据类型,而XML属性的数据类型就只能是简单数据类型.这篇笔记,就来学习一下XSD中的复杂数据类型了. 1.定 ...

  10. XML学习笔记4——XSD简单数据类型

    XSD提供了数据类型,并且支持自定义数据类型,但这一切都是建立在XSD内置数据类型和一套扩展内置数据类型的规则基础之上的,在这一篇笔记中,就来看看XSD中的数据类型. 1.XSD数据类型图 先看一下数 ...

随机推荐

  1. 【beta】Scrum站立会议第4次....11.6

    小组名称:nice! 组长:李权 成员:于淼  刘芳芳韩媛媛 宫丽君 项目内容:约跑app(约吧) 时间:  12:00——12:30 地点:传媒西楼220室 本次对beta阶段的需求进行更新如下: ...

  2. sleep() 与 wait()的比较

    1.这两个方法来自不同的类分别是,sleep来自Thread类,和wait来自Object类. sleep是Thread的静态类方法,谁调用的谁去睡觉,即使在a线程里调用了b的sleep方法,实际上还 ...

  3. 【vim】vim常用命令

    移动: h 或 向左箭头键(←)  #光标向左移劢一个字符 j 或 下箭头键(↓)    #光标向下移劢一个字符 k 或 向上箭头键(↑)    #光标向上移劢一个字符 l 或 向右箭头键(→)    ...

  4. centos中apache自用常用额外配置记录(xwamp)

    xwamp套件中apache配置,记录下,以免忘记. 配置路径 ${wwwroot_dir}/conf/httpd.conf 配置内容 <ifmodule mod_deflate.c> D ...

  5. hihocoder 1828 Saving Tang Monk II (DP+BFS)

    题目链接 Problem Description <Journey to the West>(also <Monkey>) is one of the Four Great C ...

  6. BZOJ 2424 订货(贪心+单调队列)

    怎么题解都是用费用流做的啊...用单调队列多优美啊. 题意:某公司估计市场在第i个月对某产品的需求量为Ui,已知在第i月该产品的订货单价为di,上个月月底未销完的单位产品要付存贮费用m,假定第一月月初 ...

  7. Cells UVALive - 3486(dfs序+手动开栈)

    给一棵树,每次每次询问一个点是否是另一个点的祖先? 输入时是每个下标对应节点的儿子的数量 用dfs序 时间戳.. 如果一个点是另一个点的祖先,那么它的两个标记一定在祖先的范围之内 #include & ...

  8. 解题:POI 2009 TAB

    题面 这也算是个套路题(算吗)?发现换来换去每行每列数的组成是不变的,那么就把每行每列拎出来哈希一下,复杂度$O(Tn^2log$ $n)$有点卡时=.=. 然而正解似乎不需要哈希,就像这样↓ ;i& ...

  9. vmware中ubuntu虚拟机扩容

    https://blog.csdn.net/ldzm_edu/article/details/78893721

  10. springboot如何集成mybatis的pagehelper分页插件

    mybatis提供了一个非常好用的分页插件,之前集成的时候需要配置mybatis-config.xml的方式,今天我们来看下它是如何集成springboot来更好的服务的. 只能说springboot ...