RMI に次のものがあるとします。
これはリモート インターフェイスです。
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface Hello extends Remote
{
String sayHello() throws RemoteException;
}
これはサーバー実装コードです: (インターフェースを実装します)
import java.rmi.registry.Registry;
import java.rmi.registry.LocateRegistry;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.net.*;
public class Server implements Hello {
public Server() {}
public String sayHello()
{
return "Hello, world!";
}
public static void main(String args[])
{
try
{
Server obj = new Server();
Hello stub = (Hello) UnicastRemoteObject.exportObject(obj, 0);
// Bind the remote object's stub in the registry
Registry registry = LocateRegistry.getRegistry();
registry.bind("HelloServer", stub);
System.err.println("Server ready");
} catch (Exception e)
{
System.err.println("Server exception: " + e.toString());
e.printStackTrace();
}
}
}
これはクライアントコードです:
import java.rmi.*;
import java.rmi.server.*;//////note additional imports
import java.io.*;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.net.*;
public class HelloClient2 {
private HelloClient2() {}
public static void main(String[] args) {
String host = (args.length < 1) ? null : args[0];
try {/////note this addition
RMISocketFactory.setSocketFactory(new sun.rmi.transport.proxy.RMIHttpToCGISocketFactory());
Registry registry = LocateRegistry.getRegistry(host);
Hello stub = (Hello) registry.lookup("HelloServer");
String response = stub.sayHello();
System.out.println("response: " + response);
} catch (Exception e) {
System.err.println("Client exception: " + e.toString());
e.printStackTrace();
}
}
}
ここで、rmi サーバーに接続された Objective-C クライアントを作成したいと考えています。RMI サーバーでメソッドを呼び出せるようにするために、HTTP 要求に RMI 呼び出しを埋め込む Apache Web サーバー上にプロキシを作成しました。
クライアントの行: RMISocketFactory.setSocketFactory(new sun.rmi.transport.proxy.RMIHttpToCGISocketFactory()); RMI トンネリング (http 要求で RMI 呼び出しを渡す) を担当します。したがって、基本的にこの行は、フォームの http 投稿要求を作成します
http://localhost:80/cgi-bin/java-rmi?forward=portnum
ここで、portnum はサーバー リモート オブジェクト (匿名) のポートです。
これは何を意味するのでしょうか?これは、ローカルホストのポート 80 でリッスンする Web サーバーが必要であることを意味します。理想的には 8080 でリッスンする apache tomcat Web サーバーがありますが、ポートを 80 に変更しました。
これで解決しましたが、残りの URL を処理する必要があります。そのため、Tomcat の Web アプリでは、cgi-bin という新しいディレクトリを作成しました。cgi-bin には、classes ディレクトリと web.xml ファイルを含む WEB-INF ディレクトリがあります。classes ディレクトリに、サーバーとクライアントのコンパイル済みクラス、およびサーブレット ハンドラーを追加しました。サーブレット ハンドラーは、http ポスト リクエストを受信し、rmi 呼び出しをフェッチして、それらを rmi サーバーに転送します。
サーブレット ハンドラを呼び出す必要があることを Web サーバーに知らせるにはどうすればよいですか? web.xml ファイルに、そのサーブレットのエントリを ServletHandler (クラスの名前) という名前で追加し、URL マッピングは /java-rmi. そうすれば、ローカルホストはリクエストの転送先を認識します。前に述べたように、サーブレット ハンドラーはリクエストを受け取ると、それを処理して rmi サーバーに送信します。
今私の問題はこれらにあります:
Registry registry = LocateRegistry.getRegistry(host);
Hello stub = (Hello) registry.lookup("HelloServer");
レジストリを見つけ、objective-C で検索してリモート オブジェクトを見つける方法がわかりません。(スタブはリモート オブジェクトのローカル参照です)
また、プロキシを使用して実行できるとは思いません。プロキシは、rmiサーバーに向けられたリクエストを処理するために特別に作成されています。したがって、サーブレットをテストするには、サーバーに実装されている sayHello() などの特定のリモート メソッドを呼び出す必要があります。レジストリに関連するものは、リモート メソッド呼び出しではありません。
では、これらを Objective-C でどのように処理すればよいでしょうか?