0

私の目標は、サーバーとクライアントを同時に起動する分散コンピューティング プログラムを作成することです。いくつかのマシンにインストールして、すべてのマシンが相互に通信できるようにする必要があります。つまり、マスター ノードと 5 つのスレーブ ノードがすべて 1 つのアプリケーションから通信できるようにする必要があります。

私の問題は、unicastRef を適切に使用できないことです。同じポートですべてを起動することに問題があると考えています。見落としているより良い方法はありますか?

これは私のコードの一部です(重要な部分)

試す {

        RMIServer obj = new RMIServer();
        obj.start(5225);

    } catch (Exception e) {
       e.printStackTrace();

    }


      try {
            System.out.println("We are slave's ");
            Registry rr = LocateRegistry.getRegistry("127.0.0.1", Store.PORT, new RClient());

            Call ss = (Call) rr.lookup("FILLER");

            System.out.println(ss.getHello());

        } catch (Exception e) {
            e.printStackTrace();
        }
}

これは私のメインクラスです(上記)

これはサーバークラスです(以下)

public RMIServer() { }

    public void start(int port) throws Exception {

        try {

            Registry registry = LocateRegistry.createRegistry(port, new RClient(), new RServer());

            Call stuff = new Call();

            registry.bind("FILLER", stuff);

            System.out.println("Server ready");
        } catch (Exception e) {
            System.err.println("Server exception: " + e.toString());
            e.printStackTrace();
        }
    }

何が欠けているのか、何が見落とされているのかわかりませんが、出力は次のようになります。

5225 でリッスン 8776 でリッスン サーバー準備完了 私たちはスレーブです 8776 でリッスン java.rmi.NoSuchObjectException: そのようなオブジェクトはありません.executeCall(StreamRemoteCall.java:233) の sun.rmi.server.UnicastRef.invoke(UnicastRef.java:359) の sun.rmi.registry.RegistryImpl_Stub.lookup(不明なソース) の Main.main(Main.java:62) )

62行目はこれ ::: Call ss = (Call) rr.lookup("FILLER");

4

1 に答える 1

1

サーバークラスのスタブへの参照がtryブロックに対してローカルであり、その参照が直後にガベージコレクションされるためである可能性があります。stuff代わりにクラス変数を作成してみてください。

于 2010-04-17T16:06:19.073 に答える