• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:javaのRMIについての質問:)

JavaのRMIについての質問

このQ&Aのポイント
  • Java初心者の方が、RMIについて質問されています。質問内容の要約をまとめると、RMIを使ってクライアントとサーバーの両方の機能を持たせることができるかどうかについて、具体的な事例を挙げながら説明しています。
  • 質問者が自分で作成したプログラムでは、クライアントとサーバーの通信は成功していますが、動作中のAのメソッドを呼び出す際にエラーが発生しています。質問者はこの動作を実現する方法がわからず困っている様子です。
  • 質問者はRMIの仕組みについて初心者であるため、具体的な動作の仕組みが理解しづらいと感じています。質問者は、RMIでこのような機能を実現する方法や、エラーの原因や解決策について教えていただきたいとお願いしています。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

#1です。 「java.io.NotSerializableException」が原因です。 RMIの唯一の条件に「Serializable」であることがあります。 A「FlightBodySimulator」がこれに合致していないようです。 インタフェースで「Serializable」をつけてやってください。

regorugo
質問者

お礼

#1さん、回答ありがとうございます。 返信が遅くなってしまい申し訳ありませんでした。 #1さんのおかげで上手く動作しました。 実はこれ卒業研究で、周りの人間に聞いてもわからなかったので、本当に助かりました。 懇切丁寧に対応していただいてありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

回答No.1

実際にはやったことはないのですが、A、BをRMIレジストリに登録できれば呼び出せるのではないですか。 ただし、JavaVMがループを嫌ってはじくかもしれません。 エラー内容は何でしょうか?

regorugo
質問者

お礼

#1さん、回答ありがとうございます。 返信が遅くなってしまい申し訳ありませんでした。 #1さんのおかげで上手く動作しました。 実はこれ卒業研究で、周りの人間に聞いてもわからなかったので、本当に助かりました。 懇切丁寧に対応していただき、誠にありがとうございました。

regorugo
質問者

補足

説明し忘れていました; 今回はA, Bともにサーバー、リモートオブジェクト、インターフェース、クライアントの4つに分けています。 すみませんエラー表示なんですけど・・・ (OriginalProgram, FlightBodySimulatorはAであり、Publish_SubscriberClassはBです。) java.rmi.MarshalException: error marshalling arguments; nested exception is: java.io.NotSerializableException: OriginalProgram at sun.rmi.server.UnicastRef.invoke(Unknown Source) at Publish_SubscriberClass_Stub.tellChangedParameter(Unknown Source) at Originalprogram.tellChangeParameter(OriginalProgram.java:84) at FlightBodySimulator$Flight.run(FlightBodySimulator.java:227) Caused by: java.io.NotSerializableException: OriginalProgram at java.io.ObjectOutputStream.writeObject0(Unknown Source) at java.io.ObjectOutputStream.writeObject(Unknown Source) at sun.rmi.server.UnicastRef.marshalValue(Unknown Source) ... 5 more の繰り返しです。 今回はAのクラスをBのメソッドの引数としてBに送っており、B内でその引数(Aのクラスインスタンス)をAのメソッドの引数としてA側のサーバーに送信しているのですが、 引数として送られてきたAを、Aのリモートオブジェクトから参照しようとするとエラーが出てしまいます。 (Aを参照しなかったら正常に動きました。)

全文を見る
すると、全ての回答が全文表示されます。

関連する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

    ここのサイト通りの手順でやったのですが 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で!!

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

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

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

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

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

  • javaでRMI関係の質問です。

    クライアントアプリケーションからサーバAPIを使う際に以下のエラーがでます。 eclipse+javaで開発中です。 Exception in thread "main" java.lang.NoClassDefFoundError: gnu/trove/THashSet at java.lang.Class.getDeclaredFields0(Native Method) at java.lang.Class.privateGetDeclaredFields(Unknown Source) at java.lang.Class.getDeclaredField(Unknown Source) at java.io.ObjectStreamClass.getDeclaredSUID(Unknown Source) at java.io.ObjectStreamClass.access$700(Unknown Source) at java.io.ObjectStreamClass$2.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.io.ObjectStreamClass.<init>(Unknown Source) at java.io.ObjectStreamClass.lookup(Unknown Source) at java.io.ObjectStreamClass.initNonProxy(Unknown Source) at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source) at java.io.ObjectInputStream.readClassDesc(Unknown Source) at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source) at java.io.ObjectInputStream.readObject0(Unknown Source) at java.io.ObjectInputStream.readObject(Unknown Source) at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source) at java.rmi.Naming.lookup(Unknown Source) at se.pricer.apidemo.APIDemo.<init>(APIDemo.java:26) at se.pricer.apidemo.APIDemo.main(APIDemo.java:83) Caused by: java.lang.ClassNotFoundException: gnu.trove.THashSet at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at sun.misc.Launcher$ExtClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClassInternal(Unknown Source) ... 19 more 通信のURLは合っています。 「gnu/trove/THashSet」のエラーの意味を教えて下さい。 レジストリーのバインドがうまく出来ていないと思われます。 サーバのモジュールも実行構成ー>引数タブー>VM引数でcodebasの指定方法もいまいちわかりません。 初投稿なので変な質問ですが誰か力を貸して下さい。

    • ベストアンサー
    • Java
  • Javaのソケット通信について初歩的な質問です

    私はいま、独学でJava言語の勉強をしています。 おそらく初歩的な質問ですが、いくら検索をしても見つからなかったため、質問させていただきます。 JavaでTCPを使ってソケット通信をする際の質問です。 WiFiのアクセスポイントAとアクセスポイントBがあるとします。 クライアントのアプリケーションが、アクセスポイントAからインターネットに接続し、サーバのIPアドレスとポート番号を使ってソケットを作り、サーバとTCP通信をしているとします。 このとき、クライアントが動いて、アクセスポイントBに接続したとします(接続が自動で切り替わる)。 このような場合でも、サーバとクライアントのコネクションは保っていられるのでしょうか? もしくは、このような場合でもコネクションを保つ方法はあるのでしょうか? よろしくお願いします。

    • ベストアンサー
    • Java