-1

重複の可能性:
Java RMI サーバーと Objective C クライアント

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 でどのように処理すればよいでしょうか?

4

1 に答える 1

2

上司が何を望んでいるかは関係ありません。答えは、この質問を最後に投稿したときと同じです。それはできません。質問を再投稿しても、それは変わりません。

于 2012-10-30T10:51:45.573 に答える