RPC是Remote Procedure Call 的缩写,翻译成中文就是远程过程调用,是一种在本地的机器上调用远端机器上的一个过程(方法)的技术,这个过程也被你们称为“分布式计算”,是为了提升各个分立机器的“互操做性”而发明出来的技术。
按照“数据即程序”的观点来看,RPC无非是借助一些通讯手段来互相传递数据(信息),所也她也是“高”层次的通讯手段,无非是这种通讯手段看起来更像是“过程的调用”,由于她每每以一个“函数”的面目示人,从而掩盖了她交换信息的实质。
在各类RPC技术中,我想应该以Sun的RPC最为著名,比较流行的网络文件系统NFS就是创建在SUN RPC技术基础之上的。
XMLRPC, 顾名思义(我老是喜欢这样把问题简单化,由于一个比较好的名字每每能归纳出一个东西的本质,若是某个名字让你摸不着头脑,我推荐你放弃它,由于那个发明这 个东西的人都不知道它的实质,因此你也就没有必要在其上浪费无谓的时间和精力。)就是应用了XML技术的RPC。那么什么是XML了?
XML和 RPC同样也是一个东西的缩写,这个东西就是eXtensible Markup Language,中文意思就是可扩展标记语言,标记语言就是那种用尖括号(<>)括来括去的那种语言,好比说HTML。XML的可扩展性也 体如今它只定义了语言的格式,而并无定义过多的关键字,也就是一般所说的标记(Tag),因此用户能够自由地选择定义标记。它的这种自由和简单的语法规 则也使得它广为流传,被用来表示各类数据。熟悉Lisp语言(一种被称为“一大堆”括号的语言)的同窗可能以为XML和Lisp语言有些相似,不一样的是 XML用尖括号替代了Lisp语言中的圆括号(())。事实就是他们都是那么类似,那么多语言彷佛都是等价的,不一样的只是那些应用语言的人。
XML在XMLRPC充当什么角色呢?
答 案就是“交换的数据格式”。在Sun RPC中,调用双方传递的数据是二进制的,而在XMLRPC中数据将是XML格式的。那么为何用XML而不用二进制呢?我想一方面应该是为了兼容更多的 语言,由于这个世界上除了C/C++等编译语言,还有不少相似python,perl,javascript等的脚本语言(最近有些文章也称其为“动态语 言”,由于他们一般不须要本身管理内存),另外一方面是为了隔离操做系统的差别,好比说Little Endian和Big Endian的差别等。基于种种缘由,XMLRPC选择了XML这种中间语言做为其信息的格式,而后由各个语言负责将其转变成各自native(本土)的 数据类型。关于为了兼容各个语言所发明的中间语言还有IDL(Interface Definition Language:接口定义语言),它被用于CORBA接口的定义。
关于XMLRPC的更多信息请到它的官方网站去学习,其中有XMLRPC的规范(Specification),不过是至关得简单的,由于XMLRPC自己就特别的简单,不相信?好,那下面我就请你们和我一块儿来学习如何写一个加法的XMLRPC。 javascript
eclipse下的配置以下: java
HelloHandler.java python
package com.jason.server; public class HelloHandler { public String sayHello(String name){ return "Hello " + name; } }
HelloServer.java web
package com.jason.server; import java.io.IOException; import org.apache.xmlrpc.XmlRpcException; import org.apache.xmlrpc.server.PropertyHandlerMapping; import org.apache.xmlrpc.server.XmlRpcServer; import org.apache.xmlrpc.webserver.WebServer; public class HelloServer { public static final int PORT=2009; public static void main(String[] args) { WebServer webServer=new WebServer(PORT); XmlRpcServer xmlRpcServer=webServer.getXmlRpcServer(); PropertyHandlerMapping phm=new PropertyHandlerMapping(); try { phm.addHandler("hello", com.jason.server.HelloHandler.class); xmlRpcServer.setHandlerMapping(phm); webServer.start(); System.out.println("WebServer has started !"); } catch (XmlRpcException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
HelloClient.java apache
package com.jason.client; import java.net.MalformedURLException; import java.net.URL; import java.util.Scanner; import org.apache.xmlrpc.XmlRpcException; import org.apache.xmlrpc.client.XmlRpcClient; import org.apache.xmlrpc.client.XmlRpcClientConfigImpl; public class HelloClient { public static final String URL="http://localhost:2009"; public static void main(String[] args) { XmlRpcClientConfigImpl config=new XmlRpcClientConfigImpl(); try { config.setServerURL(new URL(URL)); XmlRpcClient client=new XmlRpcClient(); client.setConfig(config); Scanner in=new Scanner(System.in); while(in.hasNextLine()){ String content=in.nextLine(); Object[] params=new Object[]{content}; String result=(String)client.execute("hello.sayHello",params); System.out.println("Response from the helloServer is:"+result); } } catch (MalformedURLException e) { e.printStackTrace(); } catch (XmlRpcException e) { e.printStackTrace(); } } }
先执行服务器端的程序,结果以下: 服务器
在执行客户端程序,结果以下: 网络