感謝のプログラミング 10000時間

たどり着いた結果(さき)は、感謝でした。

XML-RPCについての基礎知識のまとめ

<スポンサーリンク>

・XML-RPCとは、リモートプロシージャコールの略であるRPCに特別な味付けを施したもの。

・RMI(Remote Method Invocation)とは、リモートメソッド呼び出しともいう。

・RMIはJava世界における分散コンピューティングの心臓部であり、EJBの他、多くのエンタープライズアプリケーションの根幹をなすもの。

・RMIではスタブに対するリクエストををネットワークコールに翻訳する。

・スタブを通したネットワークコールにより、マシン上のメソッドが実際のオブジェクトと共に呼び出され、結果はネットワーク上にストリーミングされる。

・RPCとはRemote Procedure Calls(リモートプロシージャコール)。

・RMIではJavaオブジェクトを直接操作できるが、RPCはディスパッチ方式で構築される。

・RMIではIIOPを使ってJavaとCORBAのサーバやクライアントに接続するが、RPCではHTTPを搬送プロトコルにすることができるので、文字通りどんな種類のアプリケーションでも相互通信できる。

・RPCを使う最大の生涯は伝統的にそのエンコーディングにあった。

・XMLはシンプルにデータを表現するだけでなく、そのデータ構造の標準を提供する。

■XmlRpc
XML-RPCサーバによってハンドラに関するメソッドコールを許可するコアクラス

■XmlRpcClient
クライアントでHTTP経由でRPC通信するために使用するクラス。プロキシとクッキーをサポートする

■XMLRpcServer
サーバでRPCコールを受け取るために使用するクラス


・ハンドラとは、リモートで呼び出すクラスとメソッドのこと。

・XML-RPCハンドラは、XML-RPCリクエストを取得し、その中身をデコードして、クラスとメソッドへのリクエストをディスパッチするメソッドまたはメソッドセットのこと。

・RPCでは、リクエストがRPCサーバに渡される時、リクエストにはパラメータとテキスト値のセットが、通常classname.methodnameの形式で収められている。
→だからブログの自動投稿のときにHashtableを使ったのかも?

・RPCサーバは一致するクラスとメソッドを探して、RPCリクエストの中の型に一致するパラメータ型を入力として取得しようとする。

・一致すると、メソッドが呼び出され、結果がエンコードされて倉アントに送り戻される。

■サーバ側のソース例

package test;

import java.io.IOException;

import org.apache.xmlrpc.WebServer;
import org.apache.xmlrpc.XmlRpc;

public class HelloServer {
	
	public static void main(String[] args) {
		String port = "8765";
		try {
			
			//Apache XercesのSAXドライバを使用する
			//jarの中を見て、正しいURLを指定すること
			XmlRpc.setDriver("org.xml.sax.Parser");
			
			//サーバを開始する
			System.out.println("Starting XML-RPC Server...");
			WebServer server = new WebServer(Integer.parseInt(port));
			
			//ハンドラクラスを追加
			server.addHandler("hello", new HelloServer());
			System.out.println("HelloHandlerクラスに「hello」を登録しました");
                        server.start();
			System.out.println("リクエストを受付中です...");
		} catch (ClassNotFoundException e) {
			System.out.println("SAXドライバが配置されていません");
			e.printStackTrace();
		} 
	}
}

上の例のようにハンドラをserverに追加したら、あとはリクエストを受け付けることができる。

XML-RPCクライアントを作成するには、接続先のXML-RPCサーバのホスト名を要求するXmlRpcClientクラスをインスタンス化する必要がある。

ブログを自動投稿するサンプルを作った時に、

config.setServerURL(new URL(aServerURL));
XmlRpcClient client = new XmlRpcClient();
client.setConfig(config);

とやったアレである。

サーバへリクエストを投げるクライアントのサンプル

package test;

import java.io.IOException;
import java.net.MalformedURLException;
import java.util.Vector;

import org.apache.xmlrpc.XmlRpc;
import org.apache.xmlrpc.XmlRpcClient;
import org.apache.xmlrpc.XmlRpcException;



public class HelloClient {
	public static void main(String[] args) {
		
		try {
			XmlRpc.setDriver("org.xml.sax.Parser");
			
			//ここではリクエストを送るサーバを指定している。
			XmlRpcClient client =
					new XmlRpcClient("http://localhost:8765");
			
			//要求を作成する
			Vector params = new Vector();
			params.addElement("mizky");
			
			//要求して結果を出力する
			String result =
					(String)client.execute("hello.sayHello", params);
			
			System.out.println("サーバからの返答:" + result);
			
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (XmlRpcException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}