私は RMI について学んでおり、Hello World プログラムから始めて作業を開始し、それから他のサンプル プログラムを使用し始めましたが、それらはすべて機能しました。(エラーがありましたが、google/stackoverflow の助けを借りてデバッグしました)。そして今、私は自分のプロジェクトを書き始めました。これは基本的に、集中的な計算をサーバーにオフロードする巡回セールスマンの実装です。
サーバーのすべての RMI 実装が突然壊れたとき、すべてが正常に機能していました。すなわち。RMI アプリケーション (RMI プラグインを使用) として Eclipse から computeEngine を実行すると、次のいずれかのエラーが発生します。
java.rmi.ConnectException: Connection refused to host
またはエラー:
java.rmi.UnmarshalException: Error unmarshaling return header; nested exception is: java.io.EOFException
4 ~ 5 個の異なる RMI アプリケーションがすべて動作していましたが、サーバー上で実行している「ComputeEngine.java」ファイルが突然、アプリケーションごとにこれら 2 つのエラーのうちの 1 つを返し始めました。
注: これらのアプリケーションをテストしているので、サーバーのホスト名として「localhost」を使用します。つまり、サーバーとクライアントは同じマシンです。
私が試したこと:
- etc/hosts/ ファイルを確認したところ、127.0.0.1 が localhost として設定されていることがわかりました。また、「virtualmachine」という名前の新しいマシンを作成し、パブリック IP アドレスを使用しました。どちらも機能しませんでした。
- server.policy ファイルと client.policy ファイルを 2 回、3 回チェックしましたが、どちらも問題ないようです。
- (Eclipse の RMI プラグインを使用する代わりに) ターミナルから RMI アプリケーションを実行しようとしましたが、同じエラーが発生します。
- すべての Java プロセスを終了し、最初にサーバーを起動したことを確認してすべてを再実行しました (他のスレッドは、これらのエラーは最初にクライアントを実行したことが原因であると示唆していました)
- 私は自分自身をポートスキャンしましたが、サーバーを実行すると、ポート 1099 (デフォルトの rmi ポート) が "LISTEN" と表示されます (サーバーが例外を返しているにもかかわらず)。
- java.rmi.server.hostname を変更してみましたが、今のところ何も役に立ちません。
サーバーとクライアントの両方を同じコンピューターで実行しているときに、ホストに接続できない理由がわかりません。
RMI と Java が苦手で、明らかな解決策を見逃していたことを先制的にお詫びします。
実行しようとしているもののソース コードを含める必要がありますか?
編集: スタック トレースは次のとおりです。
ComputeEngine exception:
java.rmi.UnmarshalException: Error unmarshaling return header; nested exception is:
java.io.EOFException
at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:227)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:377)
at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)
at engine.ComputeEngine.main(ComputeEngine.java:33)
Caused by: java.io.EOFException
at java.io.DataInputStream.readByte(DataInputStream.java:267)
at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:213)
... 3 more
ありがとう!
編集2:
アプリケーションの起動時に RMIregistry を再起動すると (たとえば、rmiregistry を再起動する Eclipse RMI プラグインのオプションを選択した場合)、「codebase.jar」にあるクラスに対して ClassNotFoundError が返されることに気付きました。
Caused by: java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
java.lang.ClassNotFoundException: compute.Compute
何か案は?