開源工具: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。 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();
    }
}
}

先執行服務器端的程序,結果以下: 服務器

在執行客戶端程序,結果以下: 網絡

相關文章
相關標籤/搜索