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(); } } }
先執行服務器端的程序,結果以下: 服務器
在執行客戶端程序,結果以下: 網絡