- ベストアンサー
JavaのRMIについての質問
- Java初心者の方が、RMIについて質問されています。質問内容の要約をまとめると、RMIを使ってクライアントとサーバーの両方の機能を持たせることができるかどうかについて、具体的な事例を挙げながら説明しています。
- 質問者が自分で作成したプログラムでは、クライアントとサーバーの通信は成功していますが、動作中のAのメソッドを呼び出す際にエラーが発生しています。質問者はこの動作を実現する方法がわからず困っている様子です。
- 質問者はRMIの仕組みについて初心者であるため、具体的な動作の仕組みが理解しづらいと感じています。質問者は、RMIでこのような機能を実現する方法や、エラーの原因や解決策について教えていただきたいとお願いしています。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
#1です。 「java.io.NotSerializableException」が原因です。 RMIの唯一の条件に「Serializable」であることがあります。 A「FlightBodySimulator」がこれに合致していないようです。 インタフェースで「Serializable」をつけてやってください。
その他の回答 (1)
- いけだ ひろし(@ike-2000)
- ベストアンサー率53% (69/129)
実際にはやったことはないのですが、A、BをRMIレジストリに登録できれば呼び出せるのではないですか。 ただし、JavaVMがループを嫌ってはじくかもしれません。 エラー内容は何でしょうか?
お礼
#1さん、回答ありがとうございます。 返信が遅くなってしまい申し訳ありませんでした。 #1さんのおかげで上手く動作しました。 実はこれ卒業研究で、周りの人間に聞いてもわからなかったので、本当に助かりました。 懇切丁寧に対応していただき、誠にありがとうございました。
補足
説明し忘れていました; 今回は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を参照しなかったら正常に動きました。)
お礼
#1さん、回答ありがとうございます。 返信が遅くなってしまい申し訳ありませんでした。 #1さんのおかげで上手く動作しました。 実はこれ卒業研究で、周りの人間に聞いてもわからなかったので、本当に助かりました。 懇切丁寧に対応していただいてありがとうございました。