开源工具:XML-RPC

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。

eclipse下的配置如下:

开源工具:XML-RPC

HelloHandler.java

package com.jason.server;

public class HelloHandler {
	public String sayHello(String name){
		return "Hello " + name;
		}
}

HelloServer.java

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

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();
    }
}
}

先执行服务器端的程序,结果如下:

开源工具:XML-RPC

在执行客户端程序,结果如下:开源工具:XML-RPC

你可能感兴趣的:(XML-RPC)