• ベストアンサー

異なるOS間でRMIは利用できる?

rampilの回答

  • rampil
  • ベストアンサー率100% (2/2)
回答No.4

grant { permission java.security.AllPermission; }; という内容のテキストファイルを作成して(仮にjava.policyとします), java -Djava.security.policy=java.policy <クラス名> としてください. サーバーもクライアントも同様にして起動してみてください.

renann
質問者

補足

ありがとうございます。動きました^^ policyのファイルを指定する際は相対pathでかまわないのでしょうか?(相対pathで実際動いたんで、いいんでしょうね) ところで、もし、Remoteサーバの呼び出しもとが、今回のようなコマンドプロンプトから起動するアプリケーションではない場合(たとえばAppletなど)はpolicyをどのようにして反映してあげればいいのでしょうか?

関連するQ&A

  • RMI

    http://www.ki.rim.or.jp/~kuro/Java/RMI/index.html を参考にRMIのサンプルを試みています。 サーバ:Linux クライアント:Windows2000 ■サーバ側 ・インタフェース ・リモートオブジェクトクラス ・サーバプログラムクラス ・スタブクラス ・スケルトンクラス ・セキュリティポリシーファイル ・また、/usr/binにあるrmiregistryを違うところに 退避させました。  ■クライアント側 ・クライアントプログラムファイル ・リモートオブジェクトクラス ・セキュリティポリシーファイル それぞれ、準備した後、サーバ側で、 rmiregistry & ↓ java -Djava.security.policy=rmitestpolicy -Djava.rmi.server.codebase=http://192.168.1.10/ RMITestServer とすると、 Exception in thread "main" java.lang.NoClassDefFoundError:RMITestServer とでます。Noclassといわれている、クラス、は 存在しているのですが。。。 なにか、はずしているようでしたら教えていただきたい ので,宜しくお願いします。

  • RMIにおけるリモートサーバへの参照検索について

    現在RMIを利用したサーバ/クライアント型のプログラムの勉強をしています。 通常、RMIでは、リモートクライアントがアクセスしたいリモートサーバのネーミング(rmi://ホスト名:ポート番号/サービス名・・)を知っており、 Naming.lookup(String name)を利用してリモートサーバへの参照を特定しますが、たとえば、複数のサーバでサービスが起動している場合にリモートクライアント側ですべてのサービスのネーミングを検索することは可能なのでしょうか。 文章がわかりにくくて申し訳ありません。 不明点があれば、ご指摘願います。

  • [RMI]UnicastRemoteObject.exportObjectで毎回例外が出る

    RMIサーバ/クライアントを実験しているのですが、JDK5.0にて http://72.5.124.55/j2se/1.5.0/ja/docs/ja/guide/rmi/socketfactory/index.html や http://d.hatena.ne.jp/nowokay/20060112 にあるように、 (1)リモートオブジェクトを new (2)UnicastRemoteObject.exportObject() (3)LocateRegistry.createRegistry() (4)(3)で起動した rmiregistry に bind しようとしたのですが、(3)(4)にたどり着くまでもなく、 (2)で必ず例外(ExportException: object already exported)が出てしまいます。 具体的には以下のようなコードが私の環境では例外になってしまいます。 (便宜上内部クラスとして記述し直しています。また空白を全角にしています) =================================================================== package test; import java.rmi.Remote; import java.rmi.RemoteException; import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; import java.rmi.server.UnicastRemoteObject; public class Server {   public static void main(String[] args) throws Exception {     Server server = new Server();     server.init();   }   public void init() throws Exception {     Foo rmiObj = new FooImpl();     Foo stub = (Foo) UnicastRemoteObject.exportObject(rmiObj, 41199); //★ここで例外     LocateRegistry.createRegistry(1099);     Registry registry = LocateRegistry.getRegistry(1099);     registry.rebind("fooService", stub);   }   /* リモートインターフェース */   public interface Foo extends Remote {     public void hello() throws RemoteException;   }   public class FooImpl extends UnicastRemoteObject implements Foo {     public FooImpl() throws RemoteException {}     public void hello() throws RemoteException {       System.out.println("Hello World.");     }   } } =============================================================== ★例外 Exception in thread "main" java.rmi.server.ExportException: object already exported at sun.rmi.transport.ObjectTable.putTarget(ObjectTable.java:172) at sun.rmi.transport.Transport.exportObject(Transport.java:75) at sun.rmi.transport.tcp.TCPTransport.exportObject(TCPTransport.java:196) at sun.rmi.transport.tcp.TCPEndpoint.exportObject(TCPEndpoint.java:382) at sun.rmi.transport.LiveRef.exportObject(LiveRef.java:116) at sun.rmi.server.UnicastServerRef.exportObject(UnicastServerRef.java:180) at java.rmi.server.UnicastRemoteObject.exportObject(UnicastRemoteObject.java:293) at java.rmi.server.UnicastRemoteObject.exportObject(UnicastRemoteObject.java:235) at test.Server.init(Server.java:18) at test.Server.main(Server.java:13) =============================================================== init の2行目、つまり実質 new して exportObject しようと するだけで例外になってしまうので、原因がよく分かりません。 他プロセスに起動したものが残っていたりしないか確認しましたが、 特に見受けられませんでした。 実はそのまさに2行目を抜いた状態で RMI サーバを起動しておき、 リモートオブジェクトを取ると…うまく取れてしまいました。 (ただし RMI サーバ/クライアントはともに同じローカル) が、上で挙げた情報先にあるような書き方でできないのがどうにも 気持ち悪いのです。 どこが悪いのでしょうか…

  • ルータ越え環境でのRMI通信実現方法について(java-rmi.cgi取得方法)

    RMIサーバ(RMIレジストリ起動)、クライアントが異セグメント上にある場合の 通信実現方法についての質問です。 実行環境において、使用ポートに制限がかけられており、 Socketによる直接通信では、エラーが発生してしまいます。 ※ポートを全解放すると通信可能。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ java.rmi.ConnectIOException: Exception creating connection to: <RMIサーバIP> ; nested exception is: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ そこで、Socketによる直接通信から、HTTPプロトコルに組み入れ、RMIサーバのポートへ直接接続 する方法を試みたところ(sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket() をオーバライドするサブクラスを作成)、今度は以下のエラーが発生してしまいました。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ java.rmi.UnmarshalException: Error unmarshaling return header; nested exception is: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ サーバ上のアクセスログ、エラーログは以下の通りです。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ※アクセスログ <クライアントIP> - - [16/Dec/2007:20:25:30 +0900] "POST /cgi-bin/java-rmi.cgi?forward=3005 HTTP/1.1" 404 226 ※エラーログ [Sun Dec 16 20:25:30 2007] [error] [client クライアントIP] (2)No such file or directory: script not found or unable to stat: c:/interstage/f3fmihs/cgi-bin/java-rmi.cgi ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 以上のログから、"java-rmi.cgi"スクリプトをサーバのc:/interstage/f3fmihs/cgi-binに展開すれば、通信できるのでは ないかと考えています。 SDKが提供しているものだとは思いますが、取得方法がわかりません。 取得方法について、ご教示お願い致します。 ※環境は以下の通りです。 サーバOS:Windows Server 2003(R2) Webサーバ:Interstage Application Server SE SL クライアント:WindowsXP

  • javaのRMIについての質問:

    java初心者です。 個人的な理由でどうしてもRMIを使わなければならないのですが、 自分で調べてもどうしてもわからないので質問します。 RMIで、1つのプログラムにクライアントとサーバーの両方の機能を持たせる事は可能でしょうか? 2つのプログラムA, Bがあるとします。(Aはmainメソッドを持つ最初に実行するプログラム。) A, BでRMI通信をしたいのですが、 (1).まずAがクライアント、Bがサーバーとして、 AはBのメソッドをRMIで呼び出します。その後、 (2).Bのメソッド内で条件判断をして、ある条件に合致した時のみ (Bがクライアント、Aがサーバーとして)B内でAのメソッドを呼び、 動作中のAのメソッドを使う という事はできますでしょうか? 一応自分で作ってみたのですが、(1)は上手くいき、(2)のAのサーバーから動作中のAのメソッドを 呼び出そうとすると、エラーが出てしまいます。 説明が上手くできなくて申し訳ないのですが、どうか宜しくお願い致します。

    • ベストアンサー
    • Java
  • リモートでバッチを実行(Windows)

    お世話になります。 クライアントサーバ(Windows2003Server)からリモートサーバ(Windows2003Server)に 存在するバッチファイル(Remote.bat)をリモートで実行する方法(コマンド)をご教授ください。 方法としては、Client.bat(クライアントサーバに存在)というバッチファイルから、 Remote.batを実行したいです。 Unixのrshコマンドみたいなイメージです。 宜しくお願いします。

  • JavaのRMIで!!

    クライアントから呼び出してサーバーでhogehogeを表示させるようにこんなプログラムを書きました。 command.javaが以下の内容 import java.rmi.*; interface command extends Remote{ void comcom() throws RemoteException; } commandclient.javaが以下の内容 import java.rmi.*; public class commandclient { public static void main(String args[]) { command obj = null; try { System.setSecurityManager(new RMISecurityManager()); obj = (command)Naming.lookup("rmi://localhost/MyObject"); obj.comcom(); } catch(Exception e) { e.printStackTrace(); } } } commandserver.javaが以下の内容 import java.rmi.*; import java.rmi.server.*; public class commandserver extends UnicastRemoteObject implements command { public static void main(String args[]) { if (System.getSecurityManager() == null) { System.setSecurityManager(new RMISecurityManager()); } try { commandserver obj = new commandserver(); Naming.rebind("MyObject", obj); } catch (Exception e) { e.printStackTrace(); } } public commandserver() throws RemoteException { } public void comcom() throws RemoteException { System.out.println("hogehoge"); } } こんなプログラムを書いてコンパイルして実行したらhogehogeが表示されるかな?と思ったら実効するとなんか意味不明なエラーがでます。これはなぜでしょうか?

  • [Java]RMIのコンパイルエラー

    JAVA RMI をしています。 スタブとスケルトンを作成する為、rmicコンパイラを使用しようとするとエラーがでました。 手順は 1.コマンドプロンプトで、クラスファイルとソースファイルが存在するフォルダに移動 2.Remoteインターフェースを作成 3.Remoteオブジェクトを作成 4.2.と3.をコンパイル 5.rmicコマンドでコンパイル ***結果***************************************** rmic pack.RemoteObj error: クラス pack.RemoteObj が見つかりません。 ************************************************ こんな感じになります。 備考として... ・javaは1.4.1_01を使用しています ・コンパイルは通りました ・rmic.exeにパスは通ってます ・クラスファイルも生成されています ・packはパッケージです どこのサイトでも書かれている手順を踏みました。 他に何か原因として考えられることはあるでしょうか??

    • ベストアンサー
    • Java
  • java RMI コマンドプロンプト 

    リモートオブジェクトのrmicしてrmiregistry を実行するところまではできたのですがサーバーを実行 java -Djava.security.policy=java.policy -Djava.rmi.server.codebase=file:///C:\RMI\CalculatorServer とコマンドプロンプトでうつと Usage: java [-options] class [args...] (to execute a class) or java [-options] -jar jarfile [args...] (to execute a jar file) where options include: -client to select the "client" VM -server to select the "server" VM -hotspot is a synonym for the "client" VM [deprecated] The default VM is client. -cp <class search path of directories and zip/jar files> -classpath <class search path of directories and zip/jar files> A ; separated list of directories, JAR archives, and ZIP archives to search for class files. -D<name>=<value> set a system property -verbose[:class|gc|jni] enable verbose output ・・・・・・ と長いエラーが出ます。どうしたらエラーがでなくなるでしょうか?ファイルはC:\RMIにjava.policyとCalculatorServe.java ファイルがあります。

    • ベストアンサー
    • Java
  • 複数LANポート有効時の正しいネット経路とは?

    ここに到るまでにいくつかの質問をしたのですが、正直あるべき姿が分からなくなってしまったので、改めてネットワークの面から質問させていただきます。 <前提> サーバにはネットワークインタフェースを二つ設けています。 (1)IP:192.168.10.10。  ネットワーク:192.168.10.0/24。  ゲートウェイ:192.168.10.1  ※これをデフォルトゲートウェイとして設定。 (2)IP:192.168.1.10  ネットワーク:192.168.1.0/24。  ゲートウェイ:192.168.1.1 これらは同じルータに接続されておりますが、セグメントとしては別々です。 また、このルータからはサーバに接続するクライアントの属するネットワークがあります。 (3)ネットワーク:192.168.3.0/24  ゲートウェイ:192.168.3.1   --サーバ-- (1)|        |(2)   --ルータ--       |       |(3)   クライアント複数台 <質問> クライアントからサーバへDB接続を行いますが、2通りの接続があります。どのクライアントがどちらの接続をするかは分かりません。 (a)固定IP192.168.10.10に対してコネクションを確立する。(仮にクライアントAは192.168.3.50とします。) (b)固定IP192.168.1.10に対してコネクションを確立する。(仮にクライアントBは192.168.3.60とします。) それぞれの場合に、どういう経路で送受信されるように設定するのが正しいのでしょうか? ※実現するための設定についてではなく、本来ならどのように動くべきかという観念の質問です。(もちろん実現するための設定を教えて頂ければ尚良いのですが。) 私としては3論で悩んでいるので、参考までに以下に記します。 <持論1:サーバからクライアントへの送信はデフォルトゲートウェイのあるIFから送信されるべき>  (a)の場合   1)クライアントAからサーバへのコネクション確立要求は、ネット(3)-ネット(1)を経由して通信される。   2)サーバからクライアントAへのコネクション確立応答は、ネット(1)-ネット(3)を経由して通信される。   3)クライアントAからサーバへのコネクション確立応答は、ネット(3)-ネット(1)を経由して通信される。  (b)の場合   1)クライアントBからサーバへのコネクション確立要求は、ネット(3)-ネット(2)を経由して通信される。   2)サーバからクライアントBへのコネクション確立応答は、ネット(1)-ネット(3)を経由して通信される。    ※IPフォワーディング?   3)クライアントBからサーバへのコネクション確立応答は、ネット(3)-ネット(2)を経由して通信される。 <持論2:サーバからの送信はクライアントからの経路と同じ経路で返されるべき>  (a)の場合   1)クライアントAからサーバへのコネクション確立要求は、ネット(3)-ネット(1)を経由して通信される。   2)サーバからクライアントAへのコネクション確立応答は、ネット(1)-ネット(3)を経由して通信される。   3)クライアントAからサーバへのコネクション確立応答は、ネット(3)-ネット(1)を経由して通信される。  (b)の場合   1)クライアントBからサーバへのコネクション確立要求は、ネット(3)-ネット(2)を経由して通信される。   2)サーバからクライアントBへのコネクション確立応答は、ネット(2)-ネット(3)を経由して通信される。   3)クライアントBからサーバへのコネクション確立応答は、ネット(3)-ネット(2)を経由して通信される。 <持論3:そもそもこの環境では2つのIFを使い分ける事は無理である。>  (a)の場合   1)クライアントAからサーバへのコネクション確立要求は、ネット(3)-ネット(1)を経由して通信される。   2)サーバからクライアントAへのコネクション確立応答は、ネット(1)-ネット(3)を経由して通信される。   3)クライアントAからサーバへのコネクション確立応答は、ネット(3)-ネット(1)を経由して通信される。  (b)の場合   1)クライアントBからサーバへのコネクション確立要求は、ネット(3)-ネット(2)を経由して通信される。   2)サーバからクライアントBへのコネクション確立応答は、ネット(2)-ネット(3)を経由して通信しようとしても通信できない。    ※route add でネット(2)のゲートウェイを記載しようにも、そうすると(a)のパターンが崩れてしまう。 文字数が多くて煩わしいかと思いますが、回答宜しくお願いいたします。