• 締切済み

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といわれている、クラス、は 存在しているのですが。。。 なにか、はずしているようでしたら教えていただきたい ので,宜しくお願いします。

noname#2205
noname#2205
  • Java
  • 回答数3
  • ありがとう数1

みんなの回答

  • yuji
  • ベストアンサー率37% (64/169)
回答No.3

このサンプルでは rmic -classpath . RMITestObjectImpl なのかな? (私がやってみたわけではありませんが。)

  • yuji
  • ベストアンサー率37% (64/169)
回答No.2

rmicコマンドでスタブとスケルトンを作りましたか? こんな感じ rmic -classpath . RmiTestServer

noname#2205
質問者

補足

クライアントのほうで、スタブ,スケルトンをつくりました。 それを、サーバ(Linux)へもっていっているので スタブ,スケルトンクラスはあります。

  • yuji
  • ベストアンサー率37% (64/169)
回答No.1

単純にRMITestServer.classにCLASSPATHが通っていないだけではないでしょうか? もし、カレントディレクトリにあるのなら、 . を追加してみてください。

参考URL:
http://www.gimlay.org/~javafaq/S002.html#S002-08
noname#2205
質問者

補足

やってみました。エラーは変わりました。 java.rmi.StubNotFoundException:Stub Class not found RMITestObjectImpl_Stub nested exception is: java.lang.ClassNotFoundException:RMITestObjectImpl_Stub java.lang.ClassNotFoundException:RMITestObjectImple_Stub at java.net.URLClassLoader$1.run(URLClassLoader.java:200) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java.188) at java.lang.ClassLoader.URLClassLoader.loadClass(ClassLoader.java:299) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java.286) at java.lang.ClassLoader.loadClass(ClassLoader.java.255) at sun.rmi.server.RemoteProxy.loadClassFromClass(RemoteProxy.java:194) at sun.rmi.server.RemoteProxy.getStub(RemoteProxy.java:96) at sun.rmi.server.RemoteProxy.getStub(RemoteProxy.java:58) at sun.rmi.server.UnicastServerRef.setSkeleton(UnicastServerRef.java:159) at sun.rmi.server.UnicastServerRef.exportObject (UnicastServerRef.java:122) at sun.rmi.server.UnicastRemoteObject.exportObject(UnicastRemoteObject.java,278) at sun.rmi.server.UnicastRemoteObject.exportObject(UnicastRemoteObject.java:181) at sun.rmi.server.UnicastRemoteObject.<init> (UnicastRemoteObjecthava,78) at sun.rmi.server.UnicastRemoteObject.<init> (UnicastRemoteObjecthava,64) at RMITestObjectImpl.<init>(RMITestObjectImpl.java:6) at RMITestServer.main(RMITestServer.java:16)

関連するQ&A

  • RMI

    ここのサイト通りの手順でやったのですが http://www.hellohiro.com/rmi.htm C:\JavaHello\RMI>java -Djava.security.policy=java.policy -Djava.rmi.server.codebase=file:///C:\JavaHello\RMI\ HelloWorldObj を実行するところで Exception in thread "main" java.lang.NoClassDefFoundError: Files\Java\RMI Caused by: java.lang.ClassNotFoundException: Files\Java\RMI\ at java.net.URLClassLoader$1.run(URLClassLoader.java:200) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:188) at java.lang.ClassLoader.loadClass(ClassLoader.java:307) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) at java.lang.ClassLoader.loadClass(ClassLoader.java:252) at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320) Could not find the main class: Files\Java\RMI\. Program will exit. このようなエラーメッセージがでて解決できません。 エラーをなくす方法を教えてください!

  • 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
  • 異なるOS間でRMIは利用できる?

    UNIX上にRemoteオブジェクトを作成しリモートサーバとし、windowsPCをリモートクライアントとして通信をとりたいのですがうまくいきません。異なるOS間ではたとえネットワークが確立していて、互いにRMIの手続きをとっていてもRMIは利用できないのでしょうか?それとも何か特別な設定が必要なのでしょうか?

    • ベストアンサー
    • Java
  • 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 サーバ/クライアントはともに同じローカル) が、上で挙げた情報先にあるような書き方でできないのがどうにも 気持ち悪いのです。 どこが悪いのでしょうか…

  • [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についての質問:

    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
  • 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が表示されるかな?と思ったら実効するとなんか意味不明なエラーがでます。これはなぜでしょうか?

  • ルータ越え環境での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を使うことになったのですが、プロジェクト員一同Java初心者で、必死にJavaを勉強していますが、以下のことで困っています。申し訳ありません。助けてください。 UNIXサーバ側の設定とかをいじるプログラムがあるのですが、それをアプレットにして、SEさんがリモートからでも操作出来るようにしろ、と言われました。 とりあえず、Javaアプレットからサーバ側(アプレットのクラスが置いてあるのと同じマシン)のCプログラムを起動し、その結果を受け取るようにしたいのですが、Java経験者に相談したら「アプレットにはセキュリティ上の問題があるのでCGIかServletを使わないと出来ない」と言われました。 では…とServletの勉強を初め、サーバー側にServletEngineをいれてみたのですが、 ServletはHTTPポートと違うポート(8000番とか)を開けてそこにアクセスしなくてはいけないようにみえます。それならクライアント側プログラムをアプレットにし、サーバ側プログラムとSocket通信で結び、サーバ側プログラムがCプログラムを起動、としたほうが楽そうですが、ひとつしかポートを開きたくないと言われたのです。 もしかして「アプレット+Servlet が アプレット+CGI相当」じゃなく「Servlet が アプレット+CGI相当」なのでServlet用のポートだけ開けとけばいいとかいうことでしょうか?  とか思っていたら、JNIでC言語のメソッドをJavaメソッド扱いするとかいう話も小耳に挟みました。それでできるのかしら? ・webポートだけを開いて ・サーバ側のCプログラムを起動してその結果を受け取る ・クライアントのマシンにあらかじめインストールしなくても、ブラウザからアクセスすると操作が対話的に出来るような ものを簡単に作ろうとしたら、一体何を勉強するべきなのでしょうか…。 Applet+CGI? Applet+Servlet? RMI? JNI…? 助けてください…(TT)

    • ベストアンサー
    • Java

専門家に質問してみよう